%02X; -6ren">
gpt4 book ai didi

c - 为什么 1 字节变量的按位求补会返回 4 字节值?

转载 作者:行者123 更新时间:2023-12-02 20:38:10 26 4
gpt4 key购买 nike

我们以以下两个 1 字节变量为例:

uint8_t x1 = 0x00;
uint8_t x2 = 0xFF;

打印按位补码时,结果是一个 4 字节变量:

printf("%02X -> %02X; %02X -> %02X\n", x1, ~x1, x2, ~x2);
00 -> FFFFFFFF; FF -> FFFFFF00

我知道这可以通过转换或 mask 来“解决”:

printf("%02X -> %02X; %02X -> %02X\n", x1, (uint8_t) ~x1, x2, (uint8_t) ~x2);
00 -> FF; FF -> 00
printf("%02X -> %02X; %02X -> %02X\n", x1, ~x1&0xFF, x2, ~x2&0xFF);
00 -> FF; FF -> 00

但是为什么首先会出现非直觉行为呢?

最佳答案

许多计算机处理器的大部分操作都有一个“字”大小。例如,在 32 位机器上,可能有一条加载 32 位的指令、一条存储 32 位的指令、一条将一个 32 位数字与另一个数字相加的指令,等等。

在这些处理器上,使用其他尺寸可能会很麻烦。可能没有用于将一个 16 位数字乘以另一个 16 位数字的指令。 C 是在这些机器上长大的。它的设计使得 int (或 unsigned int)是“任何适合您正在运行的机器的大小”,而 charshort 适合在内存中存储内容,但是,一旦它们从内存加载到处理器寄存器中,C 就会像 int 一样使用它们。

这简化了早期 C 编译器的开发。编译器不必通过先执行 32 位补码指令,然后执行 AND 指令来删除不需要的高位来实现补码。它只进行了简单的 32 位补码。

今天我们可以以不同的方式开发语言,但 C 却背负着这一遗产。

关于c - 为什么 1 字节变量的按位求补会返回 4 字节值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47912738/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com