2の補数
電子回路上で、符号付き整数を使って減算処理を実装するのは難しいらしい
そこで2の補数を利用することで、加算のみを使って減算処理が実装できる
C言語において
以下のコードで、c言語内で負数の表現に2の補数が利用されていることが分かる
code:main.c
int main()
{
int x = 0b0011;
printf("%d\n", x);
int y = ~x; // y= 0b00....0011 を反転して0b11111..1100にする
printf("%d\n", y); // => -4 と出力される -4の2の補数表現は、0b0000...0100を反転させた 0b111....1011 に1加算した 0b111111...1100
}
code:main.cpp
int main()
{
std::cout
<< std::numeric_limits<unsigned long long>::min() << "\n"s // => 0
<< std::numeric_limits<unsigned long long>::max() << "\n"s; // => 18446744073709551615
std::cout
<< std::numeric_limits<long long>::min() << "\n"s // => -9223372036854775808
<< std::numeric_limits<long long>::max() << "\n"s; // => 9223372036854775807
}
上記の件ように、unsigned long long はマイナスの数を扱えいない代わりに扱える最大値が、unsignedなしの long longより大きい。
64bitのうちの先頭1bitを符号として扱わず、そのまま数として扱えるので、扱える最大値が大きくなります
(正確には符号付きではなく2の補数だけど)