我正在尝试将char打印为正值:
char ch = 212;
printf("%u", ch);
Run Code Online (Sandbox Code Playgroud)
但我得到:
4294967252
Run Code Online (Sandbox Code Playgroud)
我如何212进入输出?
小智 36
声明你ch的
unsigned char ch = 212 ;
Run Code Online (Sandbox Code Playgroud)
而你的printf将起作用.
das*_*ght 31
这是因为在这种情况下,char类型在您的系统*上签名.发生这种情况时,数据在默认转换期间进行符号扩展,同时将数据传递给具有可变数量参数的函数.由于212大于0x80,因此将其视为负数,%u将数字解释为大的正数:
212 = 0xD4
Run Code Online (Sandbox Code Playgroud)
当它被符号扩展时,FFs被预先设置为你的号码,所以它变成了
0xFFFFFFD4 = 4294967252
Run Code Online (Sandbox Code Playgroud)
这是打印的数字.
请注意,此行为特定于您的实现.根据C99规范,所有char类型都被提升为(signed)int,因为an int可以表示a char,signed或unsigned的所有值:
6.1.1.2:如果a
int可以表示原始类型的所有值,则该值将转换为int; 否则,它被转换为unsigned int.
这导致传递int给格式说明符%u,期望一个unsigned int.
要避免程序中未定义的行为,请按如下方式添加显式类型转换:
unsigned char ch = (unsigned char)212;
printf("%u", (unsigned int)ch);
Run Code Online (Sandbox Code Playgroud)
char了实施的签名.有关详细信息,请参阅此问题.
Eri*_*hil 11
这段代码中有两个错误.首先,在大多数带有signed的C实现中char,存在溢出,char ch = 212因为212不适合8位有符号char,并且C标准在存在整数溢出时不定义行为.它应该是:
unsigned char ch = 212;
Run Code Online (Sandbox Code Playgroud)
其次,在printf("%u",ch),ch将被提升到一个int正常C实现.但是,说明%u符需要a unsigned int,而C标准在传递错误类型时不会定义行为.它应该是:
printf("%u", (unsigned) ch);
Run Code Online (Sandbox Code Playgroud)