質問
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;