2011-06-17 64 views
2

当我尝试使用printf("%2x")打印0x150x75,我看到预期的输出:未定义行为而打印0x85或位0x95

但是,如果我尝试打印0x850x95 am得到0xffffff850xffffff95作为输出。为什么是这样?

#include <stdio.h> 

int main() 
{ 
    char test = 0x85; 
    printf("\n test hex: %2x \n", test); 
    return 0; 
} 

输出:

test hex: ffffff85 

回答

3

由于测试是签署字符,以及0x85和位0x95(0x80的到0xFF之间实际上任何东西)具有高阶位设置,结果将设置签署延长有1级的时候它是从焦炭提升为int。

尝试将测试声明为无符号字符。

8

尝试u_char(以及unsigned char,R是右)测试;

char为您签名并正在转换为int。如果高位为0x80,则它变为负数。

+1

'无符号char'。 'u_char'是某些系统上存在的非标准别名。 – 2011-06-17 06:40:30

2

作为Seth答案的一个小扩展,您正在打印一个int宽度的十六进制数字。 (这就是你的格式字符串所要做的)。

如果您想打印一个字符大小的十六进制数,你可以使用:

printf("test hex: %2hhx\n", test);