题
我正在初始化一个带有= 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;