gpt4 book ai didi

c - 使用 char 的字符的十六进制表示不正确,但使用 unsigned char 则正确

转载 作者:太空宇宙 更新时间:2023-11-04 05:37:21 28 4
gpt4 key购买 nike

我正在编写一个函数来打印给定文件的“hexdump”。函数如下:

bool printhexdump (FILE *fp) {
long unsigned int filesize = 0;
char c;

if (fp == NULL) {
return false;
}

while (! feof (fp)) {
c = fgetc (fp);
if (filesize % 16 == 0) {
if (filesize >= 16) {
printf ("\n");
}
printf ("%08lx ", filesize);
}
printf ("%02hx ", c);
filesize++;
}

printf ("\n");
return true;
}

但是,在某些文件上,似乎打印了某些无效的整数表示,例如:

00000000  4d 5a ff90 00 03 00 00 00 04 00 00 00 ffff ffff 00 00
00000010 ffb8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000030 00 00 00 00 00 00 00 00 00 00 00 00 ff80 00 00 00
00000040 ffff

除了最后一个ffff是由于EOF字符导致的,ff90, ffff, ffb8等都是错误的。但是,如果我将 char 更改为 unsigned char,我会得到正确的表示形式:

00000000  4d 5a 90 00 03 00 00 00 04 00 00 00 ff ff 00 00
00000010 b8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000030 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00
00000040 ff

为什么会出现上述行为?

编辑:printf()c 的处理应该是相同的,因为格式说明符没有改变。所以我不确定 char 如何得到符号扩展而 unsigned char 不会?

最佳答案

问:printf()c 的处理应该是一样的,因为格式说明符没有改变。
A:OP 是正确的,printf()c 的处理没有改变。改变的是传递给 printf() 的内容。作为 charunsigned charc 通过通常的整数提升通常为 intchar,如果有符号,则获得符号扩展。像 0xFF 这样的 char 值是 -1。像 0xFF 这样的 unsigned char 值仍然是 255。

问:所以我不确定 char 如何进行符号扩展而 unsigned char 不会?
A:他们都有一个标志扩展。 char可能是负数,所以它的符号扩展可能是01位。 unsigned char 始终为正数,因此其符号扩展为 0 位。


解决方案

char c;
printf ("%02x ", (unsigned char) c);
// or
printf ("%02hhx ", c);

// or
unsigned char c;
printf ("%02x ", c);
// or
printf ("%02hhx ", c);

关于c - 使用 char 的字符的十六进制表示不正确,但使用 unsigned char 则正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30059392/

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