如何在C中打印一个无符号的字符?
我试图打印字符作为正面价值:
char ch = 212; printf("%u", ch);
但是我得到:
4294967252
我怎么能得到输出?
声明你的ch为
unsigned char ch = 212 ;
和你的printf将工作。
这是因为在这种情况下, chartypes是在你的系统*上签名的。 发生这种情况时,数据在默认转换过程中得到符号扩展,同时将数据传递给具有可变数量参数的函数。 由于212大于0x80,因此被视为负数, %u将该数字解释为一个大的正数:
212 = 0xD4
当它是符号扩展时, FF s被预先设置为你的号码,所以它变成了
0xFFFFFFD4 = 4294967252
这是打印的数字。
请注意,这种行为是特定于您的实施。 根据C99规范,所有的chartypes都被提升为(signed) int ,因为int可以表示char ,signed或unsigned的所有值:
6.1.1.2:如果
int可以表示原始types的所有值,则该值将被转换为int; 否则,它被转换为一个unsigned int。
这导致将int传递给格式说明符%u ,该格式说明符需要unsigned int 。
要避免程序中的未定义行为,请按如下所示添加显式types转换:
unsigned char ch = (unsigned char)212; printf("%u", (unsigned int)ch);
*一般来说,标准将char的签名保留到实现中。 看到这个问题的更多细节。
这个代码有两个错误。 首先,在带有符号char大多数C实现中, char ch = 212有一个溢出,因为212不符合8位有符号char ,而C标准在整数溢出时没有定义行为。 它应该是:
unsigned char ch = 212;
其次,在printf("%u",ch) , ch将在正常的C实现中被提升为int 。 但是, %u指定符需要一个unsigned int ,并且C标准在传递错误types时没有定义行为。 它应该是:
printf("%u", (unsigned) ch);
char的范围是127到-128。 如果你指定212,ch存储-44(212-128-128)而不是212.So如果你试图打印一个负数作为无符号,你得到(最大值为unsigned int)-abs(数字) ,在这种情况下是4294967252
所以,如果你想存储212,因为它是唯一可以做的是声明为
unsigned char ch;
现在ch的范围是0到255。
如果你不能以任何理由改变声明,你可以这样做:
char ch = 212; printf("%d", (unsigned char) ch);
因为char是默认signed声明的,所以表示variables的范围是
-127至+127>
你的价值溢出了。 要获得所需的值,您必须声明unsigned修饰符。 修饰符的( unsigned )范围是:
0 to 255
得到任何数据types的范围遵循过程2^bit示例char是8位长度以获得其范围仅2 ^(power) 8 。