如何在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