2017年11月14日
《その127》 符号付き整数と符号無し整数(1) & p.56演習2-5
符号付き整数と符号無し整数
自分で使っている処理系で、各整数型が表すことのできる値の範囲を調べてみました。
#include <limits>
#include <iostream>
using namespace std;
int main() {
cout << "◆char" << '\n'
<< " min: " << (int)numeric_limits<char>::min() << '\n'
<< " max: " << (int)numeric_limits<char>::max() << '\n';
cout << "◆signed char" << '\n'
<< " min: " << (int)numeric_limits<signed char>::min() << '\n'
<< " max: " << (int)numeric_limits<signed char>::max() << '\n';
cout << "◆unsigned char" << '\n'
<< " min: " << (int)numeric_limits<unsigned char>::min() << '\n'
<< " max: " << (int)numeric_limits<unsigned char>::max() << '\n';
cout << "◆short int" << '\n'
<< " min: " << numeric_limits<short>::min() << '\n'
<< " max: " << numeric_limits<short>::max() << '\n';
cout << "◆int" << '\n'
<< " min: " << numeric_limits<int>::min() << '\n'
<< " max: " << numeric_limits<int>::max() << '\n';
cout << "◆long int" << '\n'
<< " min: " << numeric_limits<long>::min() << '\n'
<< " max: " << numeric_limits<long>::max() << '\n';
cout << "◆unsigned short int" << '\n'
<< " min: " << numeric_limits<unsigned short>::min() << '\n'
<< " max: " << numeric_limits<unsigned short>::max() << '\n';
cout << "◆unsigned int" << '\n'
<< " min: " << numeric_limits<unsigned>::min() << '\n'
<< " max: " << numeric_limits<unsigned>::max() << '\n';
cout << "◆unsigned long int" << '\n'
<< " min: " << numeric_limits<unsigned long>::min() << '\n'
<< " max: " << numeric_limits<unsigned long>::max() << '\n';
}
上の実行結果から、
int型の max は 2147483647,
unsigned int型の max は 4294967295
であることがわかります。
unsigned int型の
4294967296,
4294967297,
4294967298
といった値は、int型の max を超えていますが、これらの値を int型に型変換するとどのような結果になるのでしょうか。
型変換のルールでは、このような場合は「処理系依存」だそうです。一応、以下で試してみます。
#include <limits>
#include <iostream>
using namespace std;
int main() {
unsigned int a = 4294967296;
unsigned int b = 4294967297;
unsigned int c = 4294967298;
unsigned int d = 5294967296;
cout << (int)a << '\n';
cout << (int)b << '\n';
cout << (int)c << '\n';
cout << (int)d << '\n';
}
新版明解C++中級編 p.56 演習2-5
符号無し整数 x の全ビットを '1' と '0' とで表した文字列を作成し、その文字列の先頭文字を返却する関数を作成せよ。
const char* bits_of(unsigned x);
なお、文字列の格納先は、静的記憶域期間をもつ配列とすること。
// p56_演習2-5
#include <iostream>
#include <limits>
using namespace std;
const char* bits_of(unsigned x) {
int n = numeric_limits<unsigned int>::digits;
char* vec = new char[n + 1];
for (int i = 0; i < n; i++) {
if ((x >> i) & 1U) vec[n - i - 1] = '1';
else vec[n - i - 1] = '0';
}
vec[n] = '\0';
return vec;
}
int main()
{
unsigned a, b;
cout << "非負の整数を2つ入力\n";
cout << "a : "; cin >> a;
cout << "b : "; cin >> b;
cout << "a = "; cout << bits_of(a) << '\n';
cout << "b = "; cout << bits_of(b) << '\n';
cout << "a & b = "; cout << bits_of(a & b) << '\n'; // 論理積
cout << "a | b = "; cout << bits_of(a | b) << '\n'; // 論理和
cout << "a ^ b = "; cout << bits_of(a ^ b) << '\n'; // 論理差
cout << "~a = "; cout << bits_of(~a) << '\n'; // 1の補数
cout << "~b = "; cout << bits_of(~b) << "\n\n"; // 1の補数
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6968532
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック