我正在编码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
答案 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
值。