0

私はCを初めて使用しますが、これは初心者向けの質問です。

私はsignedint表現に関するこのコードに出くわしました:

int main(void) {
    int a = 0x8fffffff;
    printf("%d\n",a);
    return 0;
}

そしてそれは戻ります-1879048193

signed intについての私の現在の理解は、左端のビットが負または正の表示に使用されているということです。

その左側のビットは:であるため、0x9符号付き10進数に評価する必要があります。-11

int main(void) {
    int a = 0x9;
    printf("%d\n",a);
    return 0;
}

しかし、それは私に小数点以下9を与えます、私が期待したものではありません、何か考えはありますか?

4

2 に答える 2

2

表現と、「左端」(最上位) ビットが実際に意味するものを混同しています。システムがメモリ内で int (私は 32 ビットを使用します) を表す場合、型が定義するビット数を使用しますが、数値を保持するために必要なビット数は多くありません。変数のタイプによっては、後でアクセスするのに適した開始位置に配置するために、さらに数時間かかることもあります (パディング/アライメント)。

整数は次のように表すことができます。これは、右端の 4 ビットにバイナリの値 9 を持ちます。

 0b00000000000000000000000000001001

ご覧のとおり、左端のビットは確かに 1 ではありません。int は 32 ビットではないかもしれませんが、4 を超えるものは同じ話になります。同じ仮定を行うと、実際に最上位ビットを設定した結果を見ることができます。0x80000009 を印刷するテストでは、-2147483639 という結果が得られました。

于 2012-09-15T01:47:38.927 に答える
0

符号付き数値を 2 進数で表す方法はいくつかあります。IEEE 浮動小数点形式が使用するsign-and-magnitudeを考えています。float説明したように、単精度または倍精度の最上位ビットをdouble使用して符号を表します。現代のコンピューターの整数値は、2 の補数で表されます。2 の補数で表現できる値の範囲は、使用するビット数によって異なります。使用されるビット数は、コンパイラ、コンパイル対象のターゲット、および選択した変数の型によって異なります。8 ビットの 2 の補数は、-128 から +127 の範囲の数値を表すことができます。ではC通常char、符号付き 8 ビット値の型を使用し、int符号付き 32 ビット値の場合、現在私が認識しているすべてのプロセッサは、これらを 2 の補数で表します。システムが an を格納するために使用するストレージのバイト数を調べるには、 で演算子をint使用できます。ほとんどのシステムでは、anは 4 バイトまたは 32 ビットです。N ビットの 2 の補数では、実際には最上位ビット (ビット N-1) を使用して数値の符号を決定できますが、残りのビットは大きさとして解釈されません。sizeofCint

ウィキペディアの 2 の補数に関する記事を参照してください。

2 の補数の 1 つの興味深い事実は、N ビットで表現可能な最も負の数は、N ビットで表現可能な正の対応物を持たないということです。つまり、最も負の値の絶対値を表すことはできません。N ビットで表現可能な 2 の補数の最も負の値は、最上位ビット (ビット N-1) が設定され、残りのビットは 0 であり、その値は -pow(2,N-1) です。N=8 の場合、最も負の値は 0x80 で、値は -pow(2,7) または -128 である -pow(2,8-1) です。8 ビットの 2 の補数で表現できる最大の正数は 0x7F、最上位ビットが「0」、残りのビットが「1」、または pow(2,7)-1 または +127 です。

于 2012-09-15T02:04:25.663 に答える