急问:ICCAVR中长整型数据的问题
本帖最后由 lanpad 于 2012-11-4 16:30 编辑程序中有很大的数需要用到32位的无符号长整型数
写了一个测试程序:
uchar compute(uint data)//ulint compute(uint data)
{
unsigned longresult;
uchar r1,r2,r3,r4;
result = data*(data+1);
r1 = result;
r2 = (result>>8);
r3 = (result>>16);
r4 = (result>>24);
return(r3);
}
结果r1、r2可以正常返回计算所得的值
r3、r4的返回值全是0x00,
难道ICCAVR不支持32位的运算,不过我看了Help里Data Type Sizes
TYPE SIZE (bytes) RANGE
unsigned char 1 0..255
signed char 1 -128..127
char (*) 1 0..255
unsigned short 2 0..65535
(signed) short 2 -32768..32767
unsigned int 2 0..65535
(signed) int 2 -32768..32767
pointer 2 N/A
unsigned long 4 0..4294967295
(signed) long 4 -2147483648..2147483647
float 4 +/-1.175e-38..3.40e+38
double 4 +/-1.175e-38..3.40e+38
应该是支持的呀
可为什么数据计算结果高16位始终为0呢?
头文件添加了以下这些:
#include <iom128v.h>
#include <macros.h>
#include <limits.h> uchar Computer(uint data)
{
ulong result;
uchar r1,r2,r3,r4;
result = (ulong)(data)*(data+1);
r1 = (uchar)(result);
r2 = (uchar)(result>>8);
r3 = (uchar)(result>>16);
r4 = (uchar)(result>>24);
return (r3);
}
楼主试试这样行不行 result = (ulong)( data*(data+1);
这是关键。 这样应该就可以了:uchar compute(uint data)//ulint compute(uint data)
{
unsigned long result = data;
uchar r1,r2,r3,r4;
result *= data+1;
r1 = result;
r2 = (result>>8);
r3 = (result>>16);
r4 = (result>>24);
return(r3);
}问题应该是在乘法运算——两个int相乘,结果依然为int,所以高位运算结果由于编译器的截断而丢失。 本帖最后由 lanpad 于 2012-11-4 20:53 编辑
多谢诸位
关键就是少了一个强制类型转换,加上就好了
我后来也试了一下
或者将函数中的形参改为长整型也可以:
uchar compute(uint data)
改为uchar compute(ulong data)
但又有一个问题:
将compute计算的结果通过return返回,在另一个函数中赋给另一个值时,却只能传递低16位,高16位为0:
uint cord;//全局变量
uchar compute(uint data)//ulong compute(uint data)
{
unsigned longresult;
uchar r1,r2,r3,r4;
result = (ulong)data*(data+1);
return(result);
}
ulong trans()
{
ulong d_tr;
dtr = (ulong) compute(cord);//
}
dtr 本来应该等于0xAF9D1234,可是现在却是0x1234
为何传递的过程不对呢?
强制类型转换(ulong)已经到处加试过了
好奇的问下 computer函数原型是什么?
uchar compute(uint data)是这个
ulong compute(uint data)还是这个? yklstudent 发表于 2012-11-4 18:24 static/image/common/back.gif
好奇的问下 computer函数原型是什么?
uchar compute(uint data)是这个
ulong compute(uint data)还是这个 ...
这个都试过,ms对于compute的计算结果没有影响 lanpad 发表于 2012-11-4 19:13 static/image/common/back.gif
这个都试过,ms对于compute的计算结果没有影响
哎 估计你对C了解不多 还需要多补充这发面的知识 yklstudent 发表于 2012-11-4 20:27 static/image/common/back.gif
哎 估计你对C了解不多 还需要多补充这发面的知识
一直在补充
可现在改成 ulong compute 还是不对 lanpad 发表于 2012-11-4 20:54 static/image/common/back.gif
一直在补充
可现在改成 ulong compute 还是不对
ulong Computer(uint dat)
{
ulong result;
uchar r1,r2,r3,r4;
result = (ulong)(dat)*(dat+1);
r1 = (uchar)(result);
r2 = (uchar)(result>>8);
r3 = (uchar)(result>>16);
r4 = (uchar)(result>>24);
return (result);
}
在C51平台下测试 是没问题的
ICC不会软件仿真 电脑耶没法运行ICC软件
所以不知道,不过觉得程序应该是米问题的 本帖最后由 lanpad 于 2012-11-4 21:32 编辑
这是完整的测试程序,是在单片机上运行的:
#include <iom128v.h>
#include <macros.h>
#include <limits.h>
#include "parme.h"
#define uchar unsigned char //定义无符号字符为 uchar
#define uintunsigned int //定义无符号整型
#define ulong unsigned long
uint cord = 53326;;//全局变量
ulong trans()
{
ulong dtr;
dtr = (ulong)compute(cord);//
usart0_char_send(dtr>>24);/////通过单片机串口返回计算结果观察
usart0_char_send(dtr>>16);/////通过单片机串口返回计算结果观察
usart0_char_send(dtr>>8);/////通过单片机串口返回计算结果观察
usart0_char_send(dtr);/////通过单片机串口返回计算结果观察
}
ulong compute(uint data)//test
{
ulong result;
result = (ulong)data*(ulong)(data+1);
return(result);
}
main()
{
trans();
}
这个例子中的计算结果应当是53326*53327=0xA97FA812;
可串口返回的结果是:0xFF 0xFF 0xA8 0x12
高16位全变成了1 本帖最后由 yklstudent 于 2012-11-4 22:39 编辑
换了个XP电脑 试了试程序
程序是没有问题的
估计还是你自己写的有点问题
#include <iom128v.h>
#include <macros.h>
#include <limits.h>
#include "parme.h"
#define uchar unsigned char //定义无符号字符为 uchar
#define uintunsigned int //定义无符号整型
#define ulong unsigned long
uint cord = 53326;;//全局变量
void trans()
{
ulong dtr;
uchar r1,r2,r3,r4;
dtr = compute(cord);//
r1 = (uchar)(dtr>>24);
r2 = (uchar)(dtr>>16);
r3 = (uchar)(dtr>>8);
r4 = (uchar)(dtr);
usart0_char_send(r1);/////通过单片机串口返回计算结果观察
usart0_char_send(r2);/////通过单片机串口返回计算结果观察
usart0_char_send(r3);/////通过单片机串口返回计算结果观察
usart0_char_send(r4);/////通过单片机串口返回计算结果观察
}
ulong compute(uint data)//test
{
ulong result;
result = (ulong)(data)*(data+1);
return(result);
}
main()
{
trans();
}
试试这个改过得怎么样 还是不行,
看来是return有问题,估计是编译器或硬件平台的原因
最后定义成全局变量算是解决了,只能这么将就这了:
#include <iom128v.h>
#include <macros.h>
#include <limits.h>
#define uchar unsigned char //定义无符号字符为 uchar
#define uintunsigned int //定义无符号整型
#define ulong unsigned long
uint cord = 53326;//全局变量
ulong result;//全局变量
void trans()
{
ulong dtr;
uchar r1,r2,r3,r4;
compute(cord);//
dtr = result;
r1 = (uchar)(dtr>>24);
r2 = (uchar)(dtr>>16);
r3 = (uchar)(dtr>>8);
r4 = (uchar)(dtr);
usart0_char_send(r1);/////通过单片机串口返回计算结果观察
usart0_char_send(r2);/////通过单片机串口返回计算结果观察
usart0_char_send(r3);/////通过单片机串口返回计算结果观察
usart0_char_send(r4);/////通过单片机串口返回计算结果观察
}
ulong compute(uint data)//test
{
// ulong result;
result = ((ulong)data) * (((ulong)data) + 1);
// return(result);
}
voidmain()
{
init_devices();
trans();
}
页:
[1]