我目前正在修复C代码中的遗留错误。在修复此错误的过程中,我将储存unsigned int
在中unsigned long long
。但是令我惊讶的是,当我在64位版本的上编译此代码时,数学运算停止了GCC
。我发现问题在于,当我分配一个long long
int值时,我得到了一个看起来像的数字0x0000000012345678
,但是在64位计算机上,该数字变成了0xFFFFFFFF12345678
。
有人可以向我解释或指出某种规格或文档,说明在将较小的数据类型存储到较大的数据类型时会发生什么以及在C中执行此操作的合适模式是什么?
更新-代码示例
这是我在做什么:
// Results in 0xFFFFFFFFC0000000 in 64 bit gcc 4.1.2
// Results in 0x00000000C0000000 in 32 bit gcc 3.4.6
u_long foo = 3 * 1024 * 1024 * 1024;
我认为您必须告诉编译器右边的数字是无符号的。否则,它认为这是一个普通的有符号整数,并且由于设置了符号位,因此认为它为负数,然后将其符号扩展到接收器中。
因此,在右侧执行一些未签名的强制转换。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句