#include <stdio.h>
int main()
{
unsigned char i=0x80;
printf("%d",i<<1);
return 0;
}
为什么这个程序会输出256?
据我理解,由于0x80= 0b10000000,并且无符号字符有8位,左移后的'1'应该溢出,输出应该是0而不是256。
#include <stdio.h>
int main()
{
unsigned char i=0x80;
printf("%d",i<<1);
return 0;
}
为什么这个程序会输出256?
据我理解,由于0x80= 0b10000000,并且无符号字符有8位,左移后的'1'应该溢出,输出应该是0而不是256。
这是由C的整数提升规则导致的结果。基本上,任何进入表达式的变量都会被“提升”,以便像这样的操作不会失去精度。然后,根据C的可变参数规则,它作为int
传递给printf
。
如果您想要您所寻找的内容,您需要将其强制转换回unsigned char
:
#include <stdio.h>
int main()
{
unsigned char i=0x80;
printf("%d",((unsigned char)(i<<1)));
return 0;
}
注意:根据Stephen评论中指定的使用%c
是不起作用的,因为%c
还需要一个整数。
编辑:或者你可以这样做:
#include <stdio.h>
int main()
{
unsigned char i=0x80;
unsigned char res = i<<1;
printf("%d",res);
return 0;
}
或者
#include <stdio.h>
int main()
{
unsigned char i=0x80;
printf("%d",(i<<1) & 0xFF);
return 0;
}
"%c"
和 "%d"
都接受一个 int
。"%c"
将其 int
转换为一个 unsigned char
,然后打印该字符。因此,使用 Stephen 的评论中指定的 %c
不起作用,因为 %c
也期望一个整数。 - chux - Reinstate Monicaunsigned char
会晋升(promotes)为signed int
或 unsigned int
,具体取决于是否可以用signed int
来表示 unsigned char
的所有值,并且 "%c"
格式说明符(specifier)期望一个 signed int
,这是几种整数类型之一。 - Nisse Engström不要忘记为打印无符号数指定格式。
printf("%u",(unsigned char)(i<<1));
printf
函数。因此,您应该将参数强制转换为与格式说明符匹配的类型。 - Nisse Engström
i<<1
分配给一个整数来打印它,这意味着它适合并且不会溢出。尝试执行printf("%c", i<<1);
? - Stepheni << n
将产生一个整数,而不管原始类型是什么。 - Brian S