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