アフィリエイト広告を利用しています

広告

posted by fanblog

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';
}

d02_0008.png


 上の実行結果から、
  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';
}

d02_0009.png


新版明解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の補数
}

d02_05.png


新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/11/10 13:13時点)

新版 明解C 中級編 (明解シリーズ)

新品価格
¥2,916から
(2017/11/10 13:14時点)





この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/6968532
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2018年08月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。