我正在编写一个 C 程序,它必须以十六进制答案显示每个操作,但你必须显示与数据类型对应的所有字节。
例如,如果它是一个 int,它应该显示 8 个字节,如果它是一个 short 4 字节。
它适用于所有其他数据类型,包括仅显示两个字节的 char。但是 short 在我打印的时候总是显示 8 个字节
char x5 = 0xa1;
short z5 = x5;
printf("\nProblem 1f: %x\n", z5);
并打印“问题 1f:fffffffa1”
一位同学找到了一个解决方案,其中 %hx 打印了正确的字节数,但我不明白为什么这个 %x 打印了额外的字节,这些字节来自哪里?
提前致谢!
最佳答案
这是由于静默整数类型提升。因为 0xa1
是负值(-95 dec)
char
, short
将被提升为 4 字节 int
并通过 printf
函数打印负值。
为防止升级,您可以使用unsigned
类型。
下面的程序说明了有符号和无符号类型的行为:
#include<stdio.h>
#include<stdlib.h>
int main() {
char x5 = 0xa1;
short z5 = x5;
int i5 = x5;
unsigned char ux5 = 0xa1;
unsigned short uz5 = 0xa1;
unsigned int ui5 = 0xa1;
size_t sx5 = sizeof(x5);
size_t sz5 = sizeof(z5);
size_t si5 = sizeof(i5);
printf("%zu %zu %zu\n", sx5, sz5, si5);
printf("%x %x %x\n", x5, z5, i5); // silent promotion to 32 bit negative integers
printf("%x %x %x\n", ux5, uz5, ui5); // no promotion
ux5 = x5;
uz5 = z5; // remember that z5 is negative number
ui5 = i5; // same for i5
printf("%x %x %x\n", ux5, uz5, ui5); // no promotion but numbers are negative ones
return 0;
}
输出:
1 2 4
ffffffa1 ffffffa1 ffffffa1
a1 a1 a1
a1 ffa1 ffffffa1
关于c - 在 C 中显示字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48917232/