int main()
{
int a;
char b,c;
b=0x32;
c=0x24;
a=b*256+c;
printf("a=%#x\n",a);
return 0;
}
输出:
a=0x3224
b
的大小为1个字节; b*256
是char
变量的溢出。编译器是否为此操作分配了2个不同的16位寄存器? int
在这里是16位。
答案 0 :(得分:6)
在乘以下一行的文字256
时,char
会在乘法之前提升为int
。
a = b*256 + c;
答案 1 :(得分:2)
不,它不会溢出。而是将变量b
(以及c
)的内容提升到类型int
。
答案 2 :(得分:2)
C语言从不使用char
,short
域或任何其他小于int
的类型执行算术计算。在实际计算开始之前,算术运算符的操作数被提升为int
(假设int
可以表示原始类型的所有值)。那么,你的
a = b * 256 + c;
实际上被编译器解释为
a = (int) b * 256 + (int) c;
换句话说,表达式b *= 256
确实会在分配回char
时溢出b
变量,但表达式b * 256
本身不会溢出。