根据我的知识,C中的unsigned char范围是0-255。但是当我执行下面的代码时,它打印出256作为输出。这怎么可能?我有来自&#34的代码;测试你的C技能"说字母大小是一个字节的书。
main()
{
unsigned char i = 0x80;
printf("\n %d",i << 1);
}
答案 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
。后者意味着char
和short
(以及他们的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