私はちょうどこの質問をしました、そしてそれは私に何か理由があるかどうか考えさせました
1)10進数の代わりに16進数または8進数を使用してint変数を割り当てる理由と
2)異なる割り当て方法の違いは何ですか
int a=0x28ff1c; // hexideciaml
int a=10; //decimal (the most commonly used way)
int a=012177434; // octal
私はちょうどこの質問をしました、そしてそれは私に何か理由があるかどうか考えさせました
1)10進数の代わりに16進数または8進数を使用してint変数を割り当てる理由と
2)異なる割り当て方法の違いは何ですか
int a=0x28ff1c; // hexideciaml
int a=10; //decimal (the most commonly used way)
int a=012177434; // octal
16進数で記述した方が理解しやすい定数がある場合があります。
たとえば、16進数のビットフラグはコンパクトで、簡単に理解できます(一部の値は簡単に理解できます)。これは、4桁の2進数=> 1桁の16進数に直接対応しているためです。このため、一般に、16進数表現はビット単位で実行する場合に役立ちます。操作(例:マスキング)。
同様の方法で、整数が一部のフィールドで内部的に分割される場合があります。たとえば、色は次のような32ビット整数として表されることがよくあり0xAARRGGBB
ます0xAABBGGRR
。また、IPアドレス:点線表記の各IPは、「32ビット整数」表記の2桁の16進数です(通常、このような場合unsigned
、符号ビットの混乱を避けるために整数が使用されます)。
現在取り組んでいる一部のコードでは、画像の各ピクセルに対して、「アクセサリ情報」を格納するために使用する1バイトがあります。いくつかのフラグと少数を格納する必要があるため、フラグを格納するために最下位4ビットを使用し、数値を格納するために最上位4ビットを使用します。16進表記を使用すると、適切なマスクとシフトをすぐに記述できます。byte & 0x0f
フラグに4 LSビットを(byte & 0xf0)>>4
与え、4 MSビットを与えます(所定の位置に再シフトされます)。
IOCCCとUNIXのパーミッションマスク以外に8進数が使用されているのを見たことがありません(ただし、最後のケースでは、使用したことがあるかどうかはご存知のとおり、実際には便利ですchmod
)。おそらく、言語に含まれているのは、CがUNIXを作成するための言語として最初に開発されたという事実に由来しています。
デフォルトでは、整数リテラルは型ですが申し訳ありませんが、brainfart。私は今標準をチェックしました、それはこのようになります:int
、16進リテラルは、指定された値を保持するのに十分な大きさでないunsigned int
場合は型以上です。unsigned int
したがって、16進リテラルをそこに割り当てるとint
、暗黙の変換が行われます(パフォーマンスには影響しませんが、適切なコンパイラーはコンパイル時にキャストを実行します)。
u
常に署名されます。それらのタイプは、、、;の間でそれらを表すことができる最小のものですint
。long int
long long int
unsigned
タイプである可能性があります。それらの実際のタイプは、、、、、、、の間int
の値unsigned int
を表すことができる最小のlong int
ものunsigned long int
です。long long int
unsigned long long int
(C ++ 11、§2.14.2、¶2および表6)
この違いは過負荷解決1に関連している可能性がありますが、変数にリテラルを割り当てるだけの場合は特に重要ではありません。それでも、よりも大きい有効な整数定数がある可能性があることに注意してくださいint
。つまり、に割り当てると、int
符号付き整数のオーバーフローが発生します。とにかく、まともなコンパイラなら誰でもこれらの場合に警告できるはずです。
私たちのプラットフォームでは、整数は2の補数表現でint
あり、16ビット幅であり、longは32ビット幅であるとしましょう。次のようなオーバーロードされた関数があるとしましょう。
void a(unsigned int i)
{
std::cout<<"unsigned";
}
void a(int i)
{
std::cout<<"signed";
}
次に、andを呼び出すa(1)
とa(0x1)
同じ結果(signed
)が生成されますが、a(32768)
印刷されて印刷されます。signed
a(0x10000)
unsigned
読みやすさの観点から重要です-どちらを選択するかがあなたの意図を表しています。
変数を整数型として扱っている場合は、のよう2+2=4
に、10進表現を使用します。直感的でわかりやすいです。
ビットマスクとして使用している場合は、16進数、8進数、さらには2進数を使用できます。たとえば、あなたは知っているでしょう
int a = 0xFF;
最後の8ビットがに設定され1
ます。あなたはそれを知っているでしょう
int a = 0xF0;
ですが(...)11110000
、同じことを直接言うことはできません
int a = 240;
それらは同等ですが。それはあなたが数字を何に使うかに依存します。
実のところ、10進数、8進数、16進数のいずれで表現するかは問題ではありません。参考までに、コンピューターの数値は2進数で格納されます(つまり、0と1だけです)。数値を表します。つまり、表現と読みやすさの問題です。
注: 一部のC ++デバッガー(私の経験では)では、10進数表現として数値を割り当てましたが、デバッガーでは16進数として表示されます。
これは、次のように整数を割り当てるのと似ています。
int a = int(5);
int b(6);
int c = 3;
それはすべて好みに関するものであり、それが崩壊したとき、あなたはただ同じことをしているだけです。そのタイプのデータを操作するプログラムに合わせて、8進数または16進数を選択する人もいます。