C言語 符号付き整数型の負数の表現方法!処理系で使われている表現方法の調べ方

符号付き整数型の負数の表現方法は3種類あります。

  • 2の補数表現
  • 1の補数表現
  • 絶対値表現

「それぞれの表現方法」と「処理系で使用されている表現方法が2の補数表現であるか調べる方法」を紹介します。

本記事内では、明示していない場合、値は8bitのsigned char型変数に格納されているものとして説明します。

2の補数表現

【説明】

負数を表すために、 正の整数の2進数表記の全てのビットを反転したものに1を足します。
詳細な説明については、下記等の他サイトを参考にしてください。
2の補数とは?2の補数の計算方法と表現範囲をわかりやすく解説!1の補数との違いは?C言語での補数計算プログラムもチェック | A-STAR(エースター) (agency-star.co.jp)

【範囲】

-128 ~ 127

10進数 2進数
-1281000 0000
-11111 1111
00000 0000
10000 0001
1270111 1111

1の補数表現

【説明】

負数を表すために、非負整数の2進数表記の全てのビットを反転します。
また、下記の特徴があります。

  • 2の補数表現と比べて、表現できる負の数が1つ少ない。
  • 0の表現が2種類ある。2の補数表現では1種類。

【範囲】

-127 ~ 127

10進数 2進数
-1271000 0000
-11111 1110
-01111 1111
+00000 0000
10000 0001
1270111 1111

絶対値表現

【説明】

負数を表すために、 非負整数の2進数表記の符号ビット(一番左のビット)を反転します。
また、下記の特徴があります。

  • 2の補数表現と比べて、表現できる負の数が1つ少ない。
  • 0の表現が2種類ある。2の補数表現では1種類。

【範囲】

-127 ~ 127

10進数 2進数
-1271111 1111
-11000 0001
-01000 0000
+00000 0000
10000 0001
1270111 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)
補数表現の説明がわかりやすいです。

コメント

タイトルとURLをコピーしました