質問

a = 0xffで符号なしshort intを初期化しています(すべてのビットが設定されています)。 その後、bをa <!> gt; <!> gt; 7に割り当てると、(0000 0001)が得られます。ただし、奇妙なことに、cをa <!> 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

何が問題なのかわかりません。どんな助けも大歓迎です。ありがとう。

PS <!> quot; output <!> quot; 10進数および16進数形式の出力0x80およびcを意味します。

役に立ちましたか?

解決

short intには8ビットだけでなく16ビットもあります。

したがって、<!> quot; 0111 1111 1000 0000 <!> quot; 0xff <!> lt; <!> lt; 7の結果として。

他のヒント

ビットタイプを推測しないで、<stdint.h>

を使用します

short int <!> quot;通常<!> quot; は16ビットです。実際、これらの火星のコンピューターを除き、 always には16個あると確信していますが、これは標準的な約束ではありません。

特定のビット数を持つ型を宣言する場合、適合テクニックは次のとおりです。

#include <stdint.h>

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

これを行うと、shortのビット表現での完全に正しくない推測を回避できます。何らかの理由で、Microsoftは、<=>のような簡単なものであっても、C99標準に準拠するまでには長い道のりがあります。幸いなことに、プロジェクトはVC ++標準バージョンを維持しています

0x7f80が得られると期待しています。あなたが書くつもりだったのは:

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

残念ながら、VC ++(Cコンパイラ)にはC99を完全にサポートしていないため、inttypes.hがありません。サードパーティのヘッダー(Paul Hsiehのstdint.hなど)を使用する必要があります。

その結果を取得したい場合は、ビット単位のand:

を使用して、8番目の最下位ビットよりも大きいa << 7部分を切り取ることができます。

unsigned short int c = (a << 7) & 0xff;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top