クイズ

マイナスをとっても符合が変わらない数字を2つ答えなさい。
ヒント:数学ではなく、プログラミングのカテゴリなのがポイントです。


答え:

  • 0
  • 2の補数表現の負の最大値。

解説(というなの弁解)
x = -x となるxは0だけですから、0は自明で、それ以外には数学的には存在しません。
ただし、コンピュータの整数は一般的には2の補数表現で表されます。
このときマイナスをとるという演算はビット否定に1を足すという演算に
置き換えられるので、負の最大値のマイナスをとっても同じ数字になります。

例:8bitの場合の計算

1000 0000 = -128 = 負の最大値
0111 1111 = 127 = 正の最大値
1000 0000 = オーバーフローしてマイナスに。

#include <iostream>

main(){
	int a = std::numeric_limits<int>::min();
	std::cout << a << '\n';
	std::cout << -a << '\n';
}

結果(32bitCPUの場合)
-2147483648
-2147483648

コンピュータの数学ってのもなかなか難しいですね。