我目前正在修复 C 代码中的遗留错误。在修复此错误的过程中,我将一个unsigned int
存储到一个unsigned long long
中。但令我惊讶的是,当我在 GCC
的 64 位版本上编译此代码时,数学停止工作。我发现问题在于,当我为 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;
最佳答案
我认为你必须告诉编译器右边的数字是无符号的。否则它认为它是一个普通的有符号整数,并且由于设置了符号位,它认为它是负数,然后将其符号扩展到接收器中。
所以在右边做一些无符号的转换。
关于c - 在 C 语言中将较窄的数据类型存储为较宽的数据类型的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25024204/