符号付き整数型の負数の表現方法は3種類あります。
- 2の補数表現
- 1の補数表現
- 絶対値表現
「それぞれの表現方法」と「処理系で使用されている表現方法が2の補数表現であるか調べる方法」を紹介します。
本記事内では、明示していない場合、値は8bitのsigned char型変数に格納されているものとして説明します。
2の補数表現
【説明】
負数を表すために、 正の整数の2進数表記の全てのビットを反転したものに1を足します。
詳細な説明については、下記等の他サイトを参考にしてください。
2の補数とは?2の補数の計算方法と表現範囲をわかりやすく解説!1の補数との違いは?C言語での補数計算プログラムもチェック | A-STAR(エースター) (agency-star.co.jp)
【範囲】
-128 ~ 127
10進数 | 2進数 |
---|---|
-128 | 1000 0000 |
-1 | 1111 1111 |
0 | 0000 0000 |
1 | 0000 0001 |
127 | 0111 1111 |
1の補数表現
【説明】
負数を表すために、非負整数の2進数表記の全てのビットを反転します。
また、下記の特徴があります。
- 2の補数表現と比べて、表現できる負の数が1つ少ない。
- 0の表現が2種類ある。2の補数表現では1種類。
【範囲】
-127 ~ 127
10進数 | 2進数 |
---|---|
-127 | 1000 0000 |
-1 | 1111 1110 |
-0 | 1111 1111 |
+0 | 0000 0000 |
1 | 0000 0001 |
127 | 0111 1111 |
絶対値表現
【説明】
負数を表すために、 非負整数の2進数表記の符号ビット(一番左のビット)を反転します。
また、下記の特徴があります。
- 2の補数表現と比べて、表現できる負の数が1つ少ない。
- 0の表現が2種類ある。2の補数表現では1種類。
【範囲】
-127 ~ 127
10進数 | 2進数 |
---|---|
-127 | 1111 1111 |
-1 | 1000 0001 |
-0 | 1000 0000 |
+0 | 0000 0000 |
1 | 0000 0001 |
127 | 0111 1111 |
処理系で使用されている表現方法
負数の表現方法は3種類ありますがどれが適用されるかは、処理系定義です( JISX3010:2003 プログラム言語C (kikakurui.com) の6.2.6.2 整数型参照)。
処理系が2の補数表現を用いているかどうかは、変数に2の補数表現で負数となる値を代入して、その結果を出力することでわかります。
下記の例では、 2の補数表現で -127となる値(0x81、2進数で1000 0001)を変数aに代入しています。
#include <stdio.h> int main(void) { signed char a = 0x81; printf("%d\n", a); //出力は右記:-127 int b = 0x80000001; printf("%d\n", b); //出力は右記:-2147483647 return 0; }
私の環境では、signed charは8bit、intは32bitです。
参考
補数表現とは?1の補数と2の補数の違いと計算方法まとめ | サービス | プロエンジニア (internous.co.jp)
補数表現の説明がわかりやすいです。
コメント