左移魔法

时间:2011-09-24 16:26:47

标签: c++ c

我有代码:

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

为什么在班次(c = a << 4;)之后没有重置16个高级寄存器?

在带有32位linux的x86机器上执行程序。

1 个答案:

答案 0 :(得分:5)

  

b =(签名简称)(a&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;,&lt;&lt; 4)

此行执行以下操作:

  1. 计算(a <&lt; 4)。计算使用整数完成(默认为C)。其结果是:-523840
  2. 通过强制转换为signed short将结果(通过丢弃位)截断为16位。 (结果是448)
  3. 将结果转换为float(不更改值)
  4.   

    c = a&lt;&lt; 4;

    此行执行以下操作:

    1. 计算(a <&lt; 4)。计算使用整数完成(默认为C)。其结果是:-523840
    2. 将结果转换为float(不更改值)
    3. 'a'被声明为带符号的short这一事实并没有什么不同,因为所有计算总是使用int数据类型完成。我假设你的系统有32位整数。