我有:
char a[4];
a[0] = 0x76;
a[1] = 0x58;
a[2] = 0x02;
a[3] = 0x00;
我想让它成为一个int。我得到这样的回答:
int32_t i = 0 |
a[0] << ( 3 * 8) |
a[1] << ( 2 * 8) |
a[2] << ( 1 * 8) |
a[3] << ( 0 * 8);
但我不明白,移动 a[0]
一个字符超过 8 次会得到 0,不是吗?
最佳答案
语言中有一个特性叫做“整数提升”。基本上它将操作数扩展为 int
(如果它们恰好是较小的类型),然后应用指定的操作。只有当结果随后保存在一个较小的变量中时,它才会被截断并且数据会丢失。
尽管这样的功能可能看起来很奇怪,但从硬件的角度来看,它通常是有意义的。不同宽度的寄存器经常会相互重叠(x86的话,取al
、ax
、eax
和rax
),因此扩大操作数不会产生高成本。另一方面,能够用较小的类型进行算术运算,同时将结果保存在较大的类型中是主要动机:
unsigned char a = 130;
unsigned char b = 140;
int result = a + b; // no overflow
关于c - 如何从 4 个字符的数组中获取一个 int?我不明白给我的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20334501/