我想打印字符为正值:
char ch = 212;
printf("%u", ch);
但我得到:
4294967252
我怎样才能得到212
的输出?
我想打印字符为正值:
char ch = 212;
printf("%u", ch);
但我得到:
4294967252
我怎样才能得到212
的输出?
声明你的ch
作为
unsigned char ch = 212 ;
和你的printf会工作。
这是因为在这种情况下, 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
到执行。 见这个问题的更多细节。
有代码中有两处错误。 首先,在大多数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);
字符的范围为127至-128。 如果分配212,CH专卖店-44(212-128-128),如果你尝试打印为无符号你(unsigned int类型的MAX值)为负数不212.So -abs(数)在这种情况下是4294967252
所以,如果你想存储212,因为它是在CH你能做的唯一的事情是申报通道作为
unsigned char ch;
现在ch的范围是0到255。
如果你不能改变无论什么原因,声明,你可以这样做:
char ch = 212;
printf("%d", (unsigned char) ch);
由于char
是在默认情况下signed
声明,这意味着变量的范围是
-127到+127>
你的价值溢出。 为了得到所需的值您对声明的unsigned
修改。 修改器的( unsigned
)的范围是:
0 to 255
得到任何数据类型的范围内按照过程2^bit
例如char
是8位长度,以获取其范围只是2 ^(power) 8
。