c - 如何从 4 个字符的数组中获取一个 int?我不明白给我的答案

标签 c bit-shift

我有:

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的话,取alaxeaxrax),因此扩大操作数不会产生高成本。另一方面,能够用较小的类型进行算术运算,同时将结果保存在较大的类型中是主要动机:

unsigned char a = 130;
unsigned char b = 140;
int result = a + b; // no overflow

关于c - 如何从 4 个字符的数组中获取一个 int?我不明白给我的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20334501/

上一篇:C语法分析器

下一篇:Php日期国际化

相关文章:

java - 计算二进制数中 1 的最佳方法

c - 如何使用 win32 API 获取链接标签的句柄

c - c中linux内核3.10中从内核到用户空间错误的netlink多播

c++ - 右移 float

c++ - 如何在位运算中选择正确的左移?

php - 如何在 PHP 中将 3 个或更多 ID 合并为 1 个 64 位 ID

c - 使用 malloc 为堆分配内存

C 读取带有前导空格的 double 文件

使用来自另一个 CSV 的操作数据创建 CSV

java - 位移动 RandomAccessFile