2017年09月12日
《その24》 符号付き文字型(signed char 型),符号無し文字型(unsigned char 型),整数型(p.135演習4-1,p.136演習4-2)
新版明解C++入門編 p.126 〜 p.135 の範囲は 説明を読み進めるだけのページですが、そのなかで、私が実際にパソコンでチェックしてみたことを書きます。
人によって、気になる箇所は違うので、参考になるかどうか・・・。
まず、私が利用している処理系の 『単なる文字型』 が、符号付き型 なのか 符号無し型なのかを 調べました。
#include <climits>
#include <iostream>
using namespace std;
int main()
{
cout << "CHAR_MIN … " << CHAR_MIN << '\n';
cout << "CHAR_MAX … " << CHAR_MAX << '\n';
}
これで、符号付きだとわかりました。
ということは、−128 〜 +127
なんとなくですが、 ( ;´・ω・`) 符号無しのほうが 0 〜 255 で分かりやすい気がします・・・。
新版明解C++入門編p.132 に文字コード表がありますが、これを自分の処理系で表示させてみました(下の画像)。ただ、文字型が符号付きなので、私の知識では あまりきれいなコードが書けませんでした。
具体的に言うと、符号付き文字型の −128 〜 −1 の部分の取り扱いが スマートにできませんでした。
符号無し文字型だったら もっとすっきりできそうなのに・・・(* _ω_)...
とりあえずのコードは・・・
#include <iostream>
using namespace std;
int main()
{
cout << " |";
for (int i = 0; i <= 15; i++) cout << hex << " " << i;
cout << '\n';
cout << "-------------------------------------------------------";
cout << '\n';
for (int i = 0; i <= 15; i++) {
cout << " " << i << " |";
for (int j = i; j <= i + 112; j += 16) {
switch (j) {
case '\a': cout << " \\a"; break;
case '\b': cout << " \\b"; break;
case '\f': cout << " \\f"; break;
case '\n': cout << " \\n"; break;
case '\r': cout << " \\r"; break;
case '\t': cout << " \\t"; break;
case '\v': cout << " \\v"; break;
default:
cout << " " << (char)j;
}
}
for (int j = -128 + i; j <= -128 + i + 112; j += 16)
cout << " " << (char)j;
cout << '\n';
}
}
です。
ちょっと くどい感じのコードになってしまいました。結果の画面は、こんな感じになります。
新版 明解C++ 入門編 p.135 演習4-1
すべての文字について、数字/英大文字/英小文字/記号文字などの文字種が分かる一覧表を出力するプログラムを作成せよ。
// p135_演習4-1
#include <iomanip>
#include <cctype>
#include <iostream>
using namespace std;
int main()
{
cout << "文字" << " コード" << " 文字種\n";
for (char i = 0; ; i++) {
switch (i) {
case '\a': cout << " \\a"; break;
case '\b': cout << " \\b"; break;
case '\f': cout << " \\f"; break;
case '\n': cout << " \\n"; break;
case '\r': cout << " \\r"; break;
case '\t': cout << " \\t"; break;
case '\v': cout << " \\v"; break;
default: cout << " " << (isprint(i) ? i : ' ');
}
cout << ' ' << setw(4) << hex << int(i);
cout << " ";
if (isdigit(i))
cout << " 数字";
if (isupper(i))
cout << " 英大文字";
if (islower(i))
cout << " 英小文字";
if (ispunct(i))
cout << " 記号文字";
if (iscntrl(i))
cout << " 制御文字";
if (isspace(i))
cout << " 空白類文字";
cout << '\n';
if (i == 127) break;
}
}
/*
制御文字 (control character)
ディスプレイ,プリンター,通信装置などの制御に用いる特殊文字。
ASCIIコードでは、0x00〜0x1Fまでの文字と0x7Fが制御文字。
*/
出力画面表示が縦長なので、途中までです m( _ _;)m
新版 明解C++ 入門編 p.136 演習4-2
以下の二つのプログラムを作成せよ。
@ int型の最小値から最大値までの全整数値を8進数・10進数・16進数で表示。
A unsigned型の最小値から最大値までの全整数値を8進数・10進数・16進数で表示。
// p136_演習4-2_@
#include <iomanip>
#include <climits>
#include <iostream>
using namespace std;
int main()
{
cout << " 8進数 10進数 16進数\n";
int i;
for (i = INT_MIN; i < INT_MIN + 5; i++) {
cout << setw(13) << right << oct << i;
cout << setw(13) << right << dec << i;
cout << setw(11) << right << hex << i << '\n';
}
cout << '\n';
for (i = -3; i <= 3; i++) {
cout << setw(13) << right << oct << i;
cout << setw(13) << right << dec << i;
cout << setw(11) << right << hex << i << '\n';
}
cout << '\n';
for (i = INT_MAX - 4; ; i++) {
cout << setw(13) << right << oct << i;
cout << setw(13) << right << dec << i;
cout << setw(11) << right << hex << i << '\n';
if (i == INT_MAX)
break;
}
}
// p136_演習4-2_A
#include <iomanip>
#include <climits>
#include <iostream>
using namespace std;
int main()
{
cout << " 8進数 10進数 16進数\n";
unsigned i;
for (i = 0; i < 11; i++) {
cout << setw(13) << right << oct << i;
cout << setw(13) << right << dec << i;
cout << setw(11) << right << hex << i << '\n';
}
cout << '\n';
for (i = UINT_MAX - 10; ; i++) {
cout << setw(13) << right << oct << i;
cout << setw(13) << right << dec << i;
cout << setw(11) << right << hex << i << '\n';
if (i == UINT_MAX)
break;
}
}
--
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6692250
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック