为什么在C语言的4个字节上出现一个char字符

时间:2019-04-12 20:18:53

标签: c

我正在编码C代码,并且想将某个字符的十六进制值与另一个字符进行比较。那是可行的,但是使用像这样的somme值,我在4个字节上获得了一个值,这在我的比较中没有意义。

void obs_text(char* start, unsigned char debugLevel, unsigned char depth){
    printf("%c -> 0x%x\n", start[0], start[0]);
}

我期望输出带有两个十六进制字符,但实际输出为? -> 0xffffffef。 请问有人知道会发生什么吗?谢谢您的帮助。

我正在使用gcc进行编译。

Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/c++/4.2.1
Apple LLVM version 10.0.1 (clang-1001.0.46.3)
Target: x86_64-apple-darwin18.2.0
Thread model: posix

但是我也尝试使用具有相同问题的Debian OS

2 个答案:

答案 0 :(得分:2)

因为%x表示显示为十六进制的无符号整数(4个字节)。参见http://www.cplusplus.com/reference/cstdio/printf/

如此处所述,您可以使用%hhx(在C99中添加)来获得预期的行为(请参见this answer中的更多信息)。

答案 1 :(得分:0)

使用%hhx并将参数强制转换为unsigned char

printf( "%c - 0x%hhx", start[0], (unsigned char) start[0] );

%x期望其对应的参数具有类型unsigned int。您需要使用hh长度修饰符来告诉您您正在处理unsigned char值。