C 意外的位移位结果

C 意外的位移位结果,c,binary,bit-shift,bits,C,Binary,Bit Shift,Bits,我正在初始化一个a=0xff的无符号短整数(所有位都已设置)。 然后我将b分配给一个>>7,它应该会产生(0000 0001),它会产生。然而,奇怪的是,当我把c赋值给a7时; 无符号短整数c=a短整数有16位,而不仅仅是8位 因此,您可能会得到“0111111000 0000”,这是0xFF的结果。不要猜测位类型,请使用 短整数“通常”有16位。事实上,我很确定它总是有16台,除了那些火星计算机,但这不是标准的承诺 如果要声明具有特定位数的类型,一致性技术是: #include <st

我正在初始化一个a=0xff的无符号短整数(所有位都已设置)。 然后我将b分配给一个>>7,它应该会产生(0000 0001),它会产生。然而,奇怪的是,当我把c赋值给a7时;
无符号短整数c=a短整数有16位,而不仅仅是8位

因此,您可能会得到“0111111000 0000”,这是0xFF的结果。不要猜测位类型,请使用

短整数“通常”有16位。事实上,我很确定它总是有16台,除了那些火星计算机,但这不是标准的承诺

如果要声明具有特定位数的类型,一致性技术是:

#include <stdint.h>

  int8_t  a;
 uint8_t  b;
 int16_t  x;
uint16_t  y;
#包括
int8_t a;
uint8_t b;
int16_t x;
uint16_t y;

这样做可以避免对
short
的位表示进行不完全正确的猜测。出于某种原因,微软距离遵守C99标准还有很长的路要走,即使是像
这样简单的事情。幸运的是,.

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

如果你想得到这个结果,你可以切掉
a部分,我希望你得到0x7f80。我想你想写的是:


<> >代码>未签名的短int c= < /> > <强> >代码> b>代码> <强> >代码>但是,在分配AVC C++不是C编译器后,你得到了什么,它是C++编译器。C++编译器不需要支持C99。在一个理想的世界里,你应该用C编译器编译C,而不是C++编译器,但是不幸的是,我们不在理想的世界里,所以我们有时必须使用一个手持式锤子,当我们需要的是凿子时。@克里斯:关于VisualC++的情况可能是正确的,但是StdN.h可以在100%个有效C++中正确地实现。它不需要任何C99功能。考虑到这个事实和版本的标题对于VC++来说是可用的,没有充分的理由不使用它。VC是一个C编译器和一个C++编译器——它不是C99编译器。然而,一个短的可以有8或32个比特(甚至其他大小)。int16和uint16是唯一定义为16位的C类型。否,
short
不能为8位
short
的范围必须至少为
-32767
32767
,并且
无符号short
的范围必须至少为
0
65535
。32位是可以的。@Liran:谢谢你的链接。我不知道短裤的最小尺寸。我想指出的是一个普遍的误解,即某些类型有一定的固定大小。short==16位就是这样一种误解。
#include <stdint.h>

  int8_t  a;
 uint8_t  b;
 int16_t  x;
uint16_t  y;
unsigned short int c = (a << 7) & 0xff;