我正在初始化一个带有= 0xff的无符号短整数(所有位都已设置)。 然后我将b分配给<!> gt; <!> gt; 7,它应该产生(0000 0001)并且确实如此。然而,奇怪的是当我将c分配给<!> lt; <!> lt; 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

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

P.S。通过<!> quot; output <!> quot;我的意思是输出0x80和十进制和十六进制形式的c。

有帮助吗?

解决方案

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

所以你可能会得到<!>“0111 1111 1000 0000 <!>”;作为0xff <!> lt; <!> lt; 7的结果。

其他提示

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


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

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

#include <stdint.h>

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

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

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

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

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

如果你想得到那个结果,你可以使用按位来切断a << 7大于第8个最低有效位的部分 - 和

unsigned short int c = (a << 7) & 0xff;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top