gpt4 book ai didi

c - 当我们对 4 字节数和 2 字节数进行 AND 运算时会发生什么

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

我正在尝试编写一段代码以从 4 字节整数中提取每个字节的数据
经过一点点搜索,我实际上找到了可以实现这一点的代码,但我只是想知道为什么它会以创建输出的方式运行,下面是代码

#include <stdio.h>

int getByte(int x, int n);

void main()
{
int x = 0xAABBCCDD;
int n;

for (n=0; n<=3; n++) {
printf("byte %d of 0x%X is 0x%X\n",n,x,getByte(x,n));
}

}

// extract byte n from word x
// bytes numbered from 0 (LSByte) to 3 (MSByte)
int getByte(int x, int n)
{
return (x >> (n << 3)) & 0xFF;
}

输出:

byte 0 of 0xAABBCCDD is 0xDD
byte 1 of 0xAABBCCDD is 0xCC
byte 2 of 0xAABBCCDD is 0xBB
byte 3 of 0xAABBCCDD is 0xAA

结果不言自明,但为什么编译器没有将 0xFF 转换为 0x000000FF ,因为它必须对 4 字节数字执行 AND 运算,而是生成仅包含 1 字节数据而不是 4 字节数据的输出.

最佳答案

编译器确实将 0xFF 转换为 0x000000FF。由于该值是一个整数常量,0xFF 会在内部转换为 32 位值(假设您的平台有一个 32 位 int)。

请注意,您返回的值,即 0xDD0xCC0xBB0xAA,是还有 int,所以它们也有前导零,所以你实际上得到 0x000000DD0x000000CC 等等。但是,不会自动打印前导零,因此如果您希望看到它们,则需要更改格式字符串以请求包含前导零:

for (n=0; n<=3; n++) {
printf("byte %d of 0x%08X is 0x%08X\n", n, x, getByte(x,n));
}

Demo.

关于c - 当我们对 4 字节数和 2 字节数进行 AND 运算时会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47707492/

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