如何打印C中的无符号的字符?(How to print an unsigned char in C?

2019-08-18 11:37发布

我想打印字符为正值:

char ch = 212;
printf("%u", ch);

但我得到:

4294967252

我怎样才能得到212的输出?

Answer 1:

声明你的ch作为

unsigned char ch = 212 ;

和你的printf会工作。



Answer 2:

这是因为在这种情况下, char类型,您的系统*上签字。 发生这种情况时,得到的数据,而数据传递给函数的参数变量数目在默认的转换符号扩展。 由于212是大于0x80,它的处理为否定时, %u解释为大的正数数:

212 = 0xD4

当符号扩展, FF s的预先计划到你的电话号码,所以它成为

0xFFFFFFD4 = 4294967252

其是被打印的数量。

请注意,这种行为是特定于您的实现。 根据C99说明书中,所有char类型被提升到(签名) int ,因为一个int可表示的所有值char ,符号或无符号:

6.1.1.2:如果int可以表示原始类型的所有值,该值被转换为int ; 否则,它被转换为一个unsigned int

这导致在传递一个int到格式说明%u ,它期待一个unsigned int

为了避免在程序中未定义的行为,加上明确的类型转换,如下所示:

unsigned char ch = (unsigned char)212;
printf("%u", (unsigned int)ch);


*一般情况下,标准留下的符号性char到执行。 见这个问题的更多细节。



Answer 3:

有代码中有两处错误。 首先,在大多数C实现有符号char ,存在溢出char ch = 212 ,因为212不适合在一个8位带符号char ,并且当存在整数溢出C标准没有定义的行为。 它应该改为:

unsigned char ch = 212;

其次,在printf("%u",ch) ch将被提升到int在正常C实现。 然而, %u符期望一个unsigned int ,并在错误类型是通过C标准没有定义的行为。 它应该改为:

printf("%u", (unsigned) ch);


Answer 4:

字符的范围为127至-128。 如果分配212,CH专卖店-44(212-128-128),如果你尝试打印为无符号你(unsigned int类型的MAX值)为负数不212.So -abs(数)在这种情况下是4294967252

所以,如果你想存储212,因为它是在CH你能做的唯一的事情是申报通道作为

unsigned char ch;

现在ch的范围是0到255。



Answer 5:

如果你不能改变无论什么原因,声明,你可以这样做:

char ch = 212;
printf("%d", (unsigned char) ch);


Answer 6:

由于char是在默认情况下signed声明,这意味着变量的范围是

-127到+127>

你的价值溢出。 为了得到所需的值您对声明的unsigned修改。 修改器的( unsigned )的范围是:

 0 to 255

得到任何数据类型的范围内按照过程2^bit例如char是8位长度,以获取其范围只是2 ^(power) 8



文章来源: How to print an unsigned char in C?
标签: c printf