分配操作期间分配的可变大小

时间:2014-08-07 04:52:00

标签: c

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*256char变量的溢出。编译器是否为此操作分配了2个不同的16位寄存器? int在这里是16位。

3 个答案:

答案 0 :(得分:6)

在乘以下一行的文字256时,char会在乘法之前提升为int

 a = b*256 + c;

答案 1 :(得分:2)

不,它不会溢出。而是将变量b(以及c)的内容提升到类型int

答案 2 :(得分:2)

C语言从不使用charshort域或任何其他小于int的类型执行算术计算。在实际计算开始之前,算术运算符的操作数被提升为int(假设int可以表示原始类型的所有值)。那么,你的

a = b * 256 + c;

实际上被编译器解释为

a = (int) b * 256 + (int) c;

换句话说,表达式b *= 256确实会在分配回char时溢出b变量,但表达式b * 256本身不会溢出。