测试机器的字节顺序

Bru*_*uce 0 c endianness

这是我使用的程序:

int hex = 0x23456789;
char * val = &hex;
printf("%p\n",hex);
printf("%p %p %p %p\n",*val,*(val+1),*(val+2),*(val+3));
Run Code Online (Sandbox Code Playgroud)

这是我的输出:

0x23456789
0xffffff89 0x67 0x45 0x23
Run Code Online (Sandbox Code Playgroud)

我正在使用64位操作系统的64位CPU.这表明我的机器是小端.为什么第一个字节是0xffffff89?为什么ff的?

log*_*yth 5

首先,你应该使用%x,因为那些不是指针.

%x说明符期望一个整数.因为传入的值为'char'(有符号类型),所以该值将转换为整数并进行符号扩展. http://en.wikipedia.org/wiki/Sign_extension

这实际上意味着它占用了最重要的位并将其用于所有较高位.所以0x89 => 0b10001001,其最高位为'1'变为0xFFFFFF89.

正确的解决方案是指定'length'参数选项.您可以在这里获得更多信息:Printf占位符基本上,在'%'和'x'之间,您可以添加额外的参数.'hh'表示您传递的是char值.

int hex = 0x23456789;
char *val = (char*)&hex;

printf("%x\n",hex);
printf("%hhx %hhx %hhx %hhx\n", val[0], val[1], val[2], val[3]);
Run Code Online (Sandbox Code Playgroud)