値 0x7FFF と 32767 の違いを知りたいです。私の知る限り、どちらも整数である必要があり、唯一の利点は表記上の利便性です。0x
それらは同じ量のメモリを占有し、同じ方法で表されますか、または基数 10に対して数値を書き込むことを選択する別の理由がありますか?
7 に答える
唯一の利点は、頭の中で base 16 とバイナリを簡単に変換できるプログラマがいるということです。基数 16 の各数字は正確に 4 ビットを占有するため、ビットの配置を視覚化するのは非常に簡単です。そして基数 2 で書くのはかなり面倒です。
装飾されていない 10 進整数定数の型は、常に符号付きです。装飾されていない 16 進数または 8 進数の定数の型は、整数型の幅によって決定されるさまざまな境界値に達すると、符号付きと符号なしの間で交互に変化します。
符号なしとして装飾された定数 ( など0xFU
) の場合、違いはありません。
また、0 を 10 進数リテラルとして表現することはできません。
C++11 では表 6 を、C11 では 6.4.4.1/5 を参照してください。
0x7FFF 表記は、潜在的なオーバー/アンダーフローについて、10 進表記よりもはるかに明確です。
16 ビット幅のものを使用している場合、0x7FFF は、これらのビットを符号付きで使用すると、16 ビットが正の符号付き値として保持できる最大値に達していることを警告します。それに 1 を加えるとオーバーフローします。
32 ビット幅の場合も同様です。保持できる最大値 (符号付き、正) は 0x7FFFFFFF です。
これらの最大値は 16 進表記から直接確認できますが、10 進表記からはわかりません。(たまたま 32767 が 16 ビットの符号付き最大値であることを覚えていない限り)。
(注: 上記は、16 ビットが符号付きの値を保持している場合に正と負の値を区別するために 2 の補数が使用されている場合に当てはまります)。
どちらも整数リテラルであり、同じ数値を表現する別の手段を提供するだけです。ある形式を使用しても、他の形式よりも技術的な利点はありません。
8 進数表記も使用できることに注意してください (値の先頭に 0 を追加することにより)。
1 つは 16 進数 (基数 16) で、もう 1 つは 10 進数ですか?
0x7fff または 32767 をソース コードに書き込むことを選択するのは、プログラマの選択にすぎません。これらの値は、同じ方法でコンピュータ メモリに格納されるからです。
例: 従来のバイトではなく 4 ビットで操作を行う必要がある場合は、0x 表記を使用する方が快適だと思います。
char 変数の下位 4 ビットを抽出する必要がある場合は、次のようにします。
res = charvar & 0x0f;
それは同じです:
res = charvar & 15;
後者は直感的で読みにくいですが、操作は同じです
そうです、違いはありません。違いは、値が格納されている変数にあります。 リテラル 0x7FFF と 32767 は、あらゆる点でコンパイラと同じです。