c - 在 C 语言中将较窄的数据类型存储为较宽的数据类型的正确方法是什么?

标签 c types

我目前正在修复 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/

相关文章:

c - 重新分配三重指针

java - 如何全局获取Android中的鼠标位置

header 命名空间中的 C++ typedef 包含项找不到类型

arrays - Delphi:Char 和 TCharArray 数组 "Incompatible Types"

python - 如何通过 SWIG 在 Python 和 C 之间编码指向 cstring 的指针

c - 如何在 C 的 curl 中启用 scp?

.a 静态库文件的内容

typescript 中的类构造函数类型?

scala - 对于 "trait Queue[T]", `Queue` 是一种类型吗?

C# 类型比较 : Type. 等于 vs 运算符 ==