意外的位移结果

tri*_*ker 3 c binary bits bit-shift

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

这是一些代码:

unsigned short int a = 0xff;
unsigned short int b = a>>7;
unsigned short int c = a<<7; // c should == 0x80
Run Code Online (Sandbox Code Playgroud)

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

PS"输出"是指输出0x80和十进制和十六进制形式的c.

cod*_*nix 9

short int有16个,而不仅仅是8位.

所以你可能会得到"0111 1111 1000 0000"作为0xff << 7的结果.

  • 不,"短"*不能是8位.`short`的范围必须至少为`-32767`至'32767`,并且`unsigned short`至少为'0`至'65535`.但是,32位是可以的. (2认同)

Dig*_*oss 6

不要猜测比特类型,使用 <stdint.h>


短"int "通常具有16位.实际上,我很确定它除了那些火星计算机外总是有16个,但这不是标准承诺的东西.

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

#include <stdint.h>

  int8_t  a;
 uint8_t  b;
 int16_t  x;
uint16_t  y;
Run Code Online (Sandbox Code Playgroud)

这样做可以避免你对比特表示的不完全正确的猜测short.出于某种原因,微软在符合C99标准方面还有很长的路要走,即使是在简单的事情上<stdint.h>.幸运的是,一个项目维护着VC++ stdint版本.