如何在C中打印一个无符号的字符?
我试图打印字符作为正面价值:
char ch = 212; printf("%u", ch);
但是我得到:
4294967252
我怎么能得到输出?
声明你的ch
为
unsigned char ch = 212 ;
和你的printf将工作。
这是因为在这种情况下, char
types是在你的系统*上签名的。 发生这种情况时,数据在默认转换过程中得到符号扩展,同时将数据传递给具有可变数量参数的函数。 由于212大于0x80,因此被视为负数, %u
将该数字解释为一个大的正数:
212 = 0xD4
当它是符号扩展时, FF
s被预先设置为你的号码,所以它变成了
0xFFFFFFD4 = 4294967252
这是打印的数字。
请注意,这种行为是特定于您的实施。 根据C99规范,所有的char
types都被提升为(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
。