3

我正在用 a = 0xff 初始化一个 unsigned short int (所有位都已设置)。然后我将 b 分配给 a>>7 ,它应该产生 (0000 0001) 并且确实如此。然而,奇怪的是,当我将 c 分配给 a<<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

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

PS “输出”是指以十进制和十六进制形式输出 0x80 和 c。

4

5 回答 5

9

一个短整数有 16 位,而不仅仅是 8 位。

因此,您可能会得到“0111 1111 1000 0000”作为 0xff<<7 的结果。

于 2009-09-12T23:27:38.053 回答
6

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


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

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

#include <stdint.h>

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

这样做可以避免您对short. 出于某种原因,微软距离符合 C99 标准还有很长的路要走,即使是在<stdint.h>. 幸运的是,一个项目维护了一个 VC++ stdint 版本

于 2009-09-12T23:32:47.700 回答
2

我希望你得到 0x7f80。我想你要写的是:

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

于 2009-09-13T04:19:04.173 回答
0

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

于 2009-09-12T23:44:38.407 回答
0

如果您想获得该结果,您可以使用按位与切掉a << 7大于第 8 个最低有效位的部分:

unsigned short int c = (a << 7) & 0xff;
于 2009-09-13T03:59:30.983 回答