ホームページ  >  記事  >  バックエンド開発  >  現代のコンピューターにおける情報の表現と操作 - パート 2

現代のコンピューターにおける情報の表現と操作 - パート 2

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-22 14:18:40744ブラウズ

Representing and Manipulating Information in modern computer - Part 2

パート 1 へのリンク

アドレス指定とバイトオーダー

32 ビット マシンの 4 バイト int は、その 4 バイトすべてを連続したバイト シーケンスに格納します。マシンに応じて、リトル エンディアンとビッグ エンディアンの 2 つの方法で保存できます。詳細にはあまり触れませんが、リトルエンディアンは、次のような hexadeciaml 値 0x01234567 の int (32 ビットで 4 バイト) を格納します (開始アドレスが 0x100 であると仮定します):
アドレス/値
0x100 67
0x101 45
0x102 23
0x103 01
同様に、ビッグ エンディアンは次のようになります:
アドレス/値
0x100 01
0x101 23
0x102 45
0x103 67
順番の違いが分かると思います。 Linux 32 ビット、Windows、Linux 64 ビットはリトル エンディアンに従いますが、SunOS/SPARC はビッグ エンディアンに従います。

ネットワークを介してリトル エンディアン バイト オーダー マシンからビッグ エンディアン バイト オーダー マシンにメッセージを送信する場合、またはその逆にメッセージを送信する場合に問題が発生する可能性があるため、これは重要です。ネットワーク アプリケーションはこの変換を自動的に行う方法で記述されているため、ほとんどのプログラマはこれが問題であるとは考えていませんが、ネットワーク アプリケーションを作成している場合は、これを考慮する必要があるかもしれません。

整数演算

驚くかもしれませんが、2 つの正の数を加算すると負の数が得られ、x

例を示します。int を 4 ビットとして保存するコンピューターがあり、2 つの unsigned int x と y があるとします。

unsigned int x = 10; // バイナリ表現: 1010
unsigned int y = 15; // バイナリ表現: 1111
unsigned int z = x y; //?

z の値は 25 ですよね?そうですよね?

そうですね。 25 をバイナリ表現に変換すると、11001 になりますが、前述したように、私たちのコンピュータは 4 ビット整数 (符号なしの場合は 0 ~ 15 の値) しか保存できません。それでは、私たちのコンピュータは余分な 1 ビットをどうするのでしょうか?おっしゃるとおり、上位ビット (左から最初のビット) が削除され、9 に変換される 1001 が得られます。これは、16 でモジュールを実行することと同じです。つまり 25 mod 16=9 です。算術演算に限らないコンピュータのこの動作はオーバーフローとも呼ばれます。

しかし、なぜここで unsigned int を使用しているのでしょうか?この加算は符号付き整数では異なる動作をしますか?

答え: はい。しかし、結果がどうなるのか、そして私たちのコンピューターがどのような結末を迎えるのかを説明する前に、まず、4 ビット サイズの整数で符号付きと符号なしがどのように異なるのかを理解しましょう。

符号付き整数

-8(bin rep: 1000) から 7(bin rep: 0111) までの正と負の両方の数値を保存できます。上位ビット (左から最初のビット) は符号付き整数の負の値を与えるもので、残りのビットは正の値を返します。したがって、最小の数値を取得するには、上位ビットを 1 に、他のビットを 0 に反転する必要があり、最大の数値を取得するには、上位ビットを 0 に、他のビットを 1 に反転する必要があります。

符号なし整数

0(バイナリ表現: 0000) から 15(ビン表現: 1111) までの正の数値のみを保存できます。

x=10 と y=15 は加算前にオーバーフローするため、より小さい値を使用します。
int x = 5; // 0101
int y = 6; // 0110
int z = x y // ???

符号付きの考慮を無視すると、バイナリ表現は 1011 になるはずです。ご覧のとおり、上位ビットが 1 に反転され、上から z の値は 11 ではなく -5(= -1*2^3 2^1 2^0) になります。

また、否定語を 2 つ追加すると、postivie になる可能性があります。例:
int x = -8 // 1000
int y = -5 // 0101
int z = x y // ???

z は -13 になります。これは 2 進数で 10011 です (上位ビットは負の値、つまり -1*2^4 = -16) ですが、コンピューターは 4 ビットしか保存できないため、上位ビットは削除され、 10進数で3の0011になります。またオーバーフローします。

これが x < の理由です。 y は、x - y < とは異なる結果になる可能性があります。整数オーバーフローを適切に処理しない場合は 0。プログラマーとして、データ型を選択するときは、何時間ものデバッグの結果になる可能性があるため、さまざまな状況でのデータ型の容量と動作を考慮して、常に注意を払う必要があります。

今日はここまでです。ここにある情報が間違っていたり、不足している場合はコメントアウトしてください。ありがとうございます。

以上が現代のコンピューターにおける情報の表現と操作 - パート 2の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。