意外的位移结果

时间:2009-09-12 23:24:02

标签: c binary bit-shift bits

我正在初始化一个带有= 0xff的无符号短整数(所有位都已设置)。 然后我将b分配给>> 7,它应该产生(0000 0001)并且确实如此。然而,奇怪的是当我将c分配给<<<<<<<<<<<<<<<<" 7我通过输出0x80(1000 0000)和c来测试它,但它们不一样。

以下是一些代码:

unsigned short int a = 0xff;
unsigned short int b = a>>7;
unsigned short int c = a<<7; // c should == 0x80

我不确定问题是什么。任何帮助表示赞赏。感谢。

P.S。 “输出”是指输出0x80和十进制和十六进制形式的c。

5 个答案:

答案 0 :(得分:9)

short int有16,而不仅仅是8位。

因此,你可能会得到“0111 1111 1000 0000”作为0xff&lt;&lt; 7的结果。

答案 1 :(得分:6)

不要猜测位类型,请使用<stdint.h>


短的int “通常”有16位。实际上,我很确定总是除了那些火星计算机之外还有16个,但这不是标准所承诺的。

如果要声明具有特定位数的类型,则符合技术为:

#include <stdint.h>

  int8_t  a;
 uint8_t  b;
 int16_t  x;
uint16_t  y;

这样做可以避免对short的位表示进行不完全正确的猜测。出于某种原因,微软在符合C99标准方面还有很长的路要走,即使是在<stdint.h>之类的简单事情上也是如此。幸运的是,a project maintains a VC++ stdint version

答案 2 :(得分:2)

我希望你得到0x7f80。我想你的意思是:

unsigned short int c = b <<7; // c should == 0x80

答案 3 :(得分:0)

不幸的是,VC ++(C编译器)没有inttypes.h,因为它不完全支持C99。你必须使用第三方标题(例如Paul Hsieh的stdint.h)。

答案 4 :(得分:0)

如果你想得到那个结果,你可以使用按位 - 和

来切断大于第8个最低位的部分a << 7
unsigned short int c = (a << 7) & 0xff;