左移魔法

nic*_*ick 1 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);
Run Code Online (Sandbox Code Playgroud)

输出:

(signed short)(a << 4): 448.000000
(a << 4): -523840.000000
Run Code Online (Sandbox Code Playgroud)

为什么16个高级寄存器在shift(c = a << 4;)后没有复位?

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

Nil*_*nck 5

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

该行执行以下操作:

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

c = a << 4;

该行执行以下操作:

  1. 计算(a << 4).计算使用整数完成(默认为C).其结果是:-523840
  2. 将结果转换为float(不更改值)

事实上'a'被声明为带符号的short并没有什么区别,因为所有计算总是使用int数据类型完成.我假设你的系统有32位整数.