C语言中unsigned char的范围

时间:2015-06-30 21:53:36

标签: c

根据我的知识,C中的unsigned char范围是0-255。但是当我执行下面的代码时,它打印出256作为输出。这怎么可能?我有来自&#34的代码;测试你的C技能"说字母大小是一个字节的书。

main()
{
 unsigned char i = 0x80;
 printf("\n %d",i << 1);
} 

4 个答案:

答案 0 :(得分:5)

因为<< * 的操作数经历整数提升。它实际上等同于(int)i << 1

<小时/> *对于C中的大多数运算符都是如此。

答案 1 :(得分:4)

正在发生一些事情。

首先,表达式i << 1的类型为int,而不是char;文字1的类型为int,因此i的类型被“提升”为int,而0x100完全在有符号整数的范围内。

其次,%d转换说明符期望其对应的参数具有类型int。因此,该参数被解释为整数。

如果要打印已签名char的数值,请使用转化说明符%hhd。如果要打印未签名char的数字值,请使用%hhu

答案 2 :(得分:2)

对于算术运算,char在执行操作之前被提升为int。有关详细信息,请参阅the standard。简化:在执行操作之前,首先将“较小”类型置于“较大”类型。对于移位运算符,结果类型是左侧操作数的类型,而对于例如左侧操作数。 +和其他“合并”运算符在两者中都较大,但至少为int。后者意味着charshort(以及他们的unsigned对应者总是被提升为int,结果也是int。(简化,详情请阅读标准)

另请注意,%d采用int参数,而不是char

附加说明:

  • unsigned char不一定是范围0..255。检查limits.h,您会在那里找到UCHAR_MAX
  • char和“byte”在标准中同义使用,但两者都不一定是8位宽(仅适用于现代通用CPU)。

答案 3 :(得分:0)

正如其他人已经解释的那样,声明&#34; printf(&#34; \ n%d&#34;,i&lt;&lt; 1);&#34;进行整数提升。因此,整数值128的右移会产生256.您可以尝试以下代码来打印&#34; unsigned char&#34;的最大值。 &#34; unsigned char&#34;的最大值已设置所有位。所以使用&#34;〜&#34;进行按位NOT运算应该给你最大的ASCII值为255。

 int main()
 {
     unsigned char ch = ~0;
     printf("ch = %d\n", ch);
     return 0;
 }

Output:-
M-40UT:Desktop$ ./a.out 
ch = 255