2011-09-24 88 views
1

我有代码:左移魔术

signed short a = -32740; 
float c; 
float b; 
b = (signed short)(a << 4); 
c = a << 4; 
printf("(signed short)(a << 4): %f\n", b); 
printf("(a << 4): %f\n", c); 

输出:

(signed short)(a << 4): 448.000000 
(a << 4): -523840.000000 

为什么16个寄存器不复位移位(c = a << 4;)后?

在x86机器上使用32位linux执行的程序。

+3

你的意思是'float c'你在哪里写'float a'?什么是“高级注册”? – Cameron

+2

你编译过吗? -1不编译它,测试它,** **发布之前! – Nawaz

+0

整型促销。 –

回答

5

b =(签名的简称)(a < < 4);

这条线执行以下操作:

  1. 计算(一个< < 4)。计算是用整数完成的(默认为C)。结果是:-523840
  2. 通过强制转换为带符号的short将结果截断(通过删除位)为16位。 (结果448)
  3. 转换结果漂浮

C(没有价值变动)=一个< < 4;

这条线执行以下操作:

  1. 计算(一个< < 4)。计算是用整数完成的(默认为C)。其结果是:-523840
  2. 结果转换为浮动(中值无变化)

那是一个'被声明为一个事实,签订短期不会有所作为,因为所有的计算都始终做int数据类型。我假设你的系统有32位整数。

+0

这是否意味着没有操作符像'short operator <<(short,short)'?' – nick

+1

实际上,是的;没有移位运算符在短整数上工作。 –

+1

当你把它放在短的时候,编译器会和或者移出高位的16位。 –