首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

两个int 型数相乘,如果积超出int型最大表示数,结果如何取的

2012-04-20 
两个int 型数相乘,如果积超出int型最大表示数,结果怎么取的?sizeof(int)4,在两个GCC和IAR for Arm下面计

两个int 型数相乘,如果积超出int型最大表示数,结果怎么取的?
sizeof(int)=4,
在两个GCC和IAR for Arm下面计算出来的结果不同。
GCC是正确的,IAR计算结果不对,请教怎么将下面几行语句移植到IAR下面来
(代码实际就是触摸屏tslib校准算法中一段代码),我把它简化如下:
 
int a[7];
int aa,bb,cc,dd;

a[0]=111793920;
a[1]=-153434;
a[2]=-57;
a[6]=65536;

aa=412*a[0];
bb=272*a[1];
cc=aa+bb+a[2];
dd=cc/a[6];
GCC编译计算的结果是正确的,输出值aa,bb,cc,dd为:
-63214808 -15504 48563608 741

aa ,bb ,cc 是怎么算出来的,有点不清楚,望高手指点。



在另外一个编译器(IAR for Arm V6.21)同样是上面的值,aa bb cc dd 为:
-1185545216 -32528008 -1218073281 -18586
这个是错误的计算结果

现在要把GCC上面这段代码移到IAR上面去,要求计算结果一样,怎么弄?
这段代码的目的是避免符点运算,将数都放大了65536倍 ,最终再除以65536. 
如果不转成浮点,有办法不?

多谢!!




[解决办法]
换成long long 或者long long类似物(64位整型)就可以.

[解决办法]
我用gcc计算出来的结果
-1185545216,-41734048,-1227279321,-18726
[解决办法]
两种办法:
1. 用long long
2. 如果用long long不行的话,就自己定义一个结构,用来表示一个大的整数,比如:
typedef struct _big_int
{
int high_part;
int low_part;
}big_int;
[解决办法]
下面数组下标不是一一对应,所以提供的范例值不对!

lin->a[0] = cal.a[1];
lin->a[1] = cal.a[2];
lin->a[2] = cal.a[0];
lin->a[3] = cal.a[4];
lin->a[4] = cal.a[5];
lin->a[5] = cal.a[3];
lin->a[6] = cal.a[6];

热点排行