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

C 当我们对4字节数和2字节数进行运算时会发生什么,c,bit-manipulation,bitwise-operators,C,Bit Manipulation,Bitwise Operators,我正试图编写一段代码,从一个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 0

我正试图编写一段代码,从一个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;
}

结果不言自明,但为什么编译器没有将0xFF转换为0x000000FF,因为它必须使用4字节的数字执行和操作,而生成的输出只包含1字节的数据,而不是4字节的数据。

输出是一个4字节的数字,但是
printf(“%X”)
不打印任何前导零位


如果执行
printf(“foo 0x%X bar\n”,0x0000AA)
您将得到
foo 0xAA bar
作为输出。

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

请注意,返回的值,即
0xDD
0xCC
0xBB
0xAA
,也都是
int
s,因此它们也有前导零,因此实际上得到的是
0x000000DD
0x000000CC
,等等。但是,前导零不会自动打印,因此如果希望看到它们,则需要更改格式字符串以请求包含前导零:

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

for(n=0;n0xFF和0x000000FF都是完全相同的东西,默认情况下,格式设置将删除前导的0。如果要在输出中打印它们,只需指定它:

printf("byte %d of 0x%X is 0x08%X\n",n,x,getByte(x,n));

但是由于您正在打印字节,我不太清楚为什么您会期望前导的0。

具体的答案是
0xFF
0x000000FF
在C中具有相同的类型和相同的值。只是输出格式不同于ER1597336,奇怪的是,如果格式是
%d”
而不是
“0x%X”
,对于从
getByte(x,n)返回的4字节
int
值,您是否期望
“255”
“0000000 255”
小代码:在C中,<代码> 0xFF是一个整数常量,不是字面的,在这种情况下,类型为<代码> int >代码> C。2个文字:字符串文字和复合文字可以有自己的地址。<代码> 0xFF不能。在其他语言如C++、<代码> 0xFF中可以有地址,并称为文字。blinkenlight:谢谢你提供的信息。请分享用前导零打印完整数字的语句。我刚刚在printf上用上面提到的格式说明符在线运行了下面的代码(“0x%X的字节%d是0x08%X\n”,n,X,getByte(X,n));但我得到的不是通常的输出,而是0xAABBCCDD的-0字节0x08DD@user1597336对不起,我把
%
放错位置了,应该是
0x%08X
。请查看更新和演示链接。
printf("byte %d of 0x%X is 0x08%X\n",n,x,getByte(x,n));