int型、char型の変数に格納されているにかかわらずアスキーコードを%c出力変換指定子を使ってprintf 出力表示するとアスキーコードに対応する半角英数字がコマンドプロンプト画面に表示されます

アレサ 「ふん ふふ~ん😊010101101010101001010101・・・


あちらの世界(シーズン1)ではchar型の変数について


どう記述されているかな?


なになに・・・



char型の変数に格納できる1文字とは


アルファベットや数字や記号などの


「半角文字」


である・・・ですか・・・


アレサ 「010000101010010101・・・



アルファベットや数字だけでなく


「記号」などの半角文字・・・


記号もchar型の変数に格納できるのですか・・・


うふふ



では


記号をchar型の変数aに格納して


printf出力表示できるかためしてみようかな?」


#include<stdio.h>


int main(void)

{

char a='{';


printf("%c",a);


return 0;

}


プログラムの実行結果

{


アレサ「


記号{ も 本当にchar型の変数に格納、printf出力表示できています。


ここでも


半角記号{を char型の変数に格納する際は


コンパイラに文字と認識させるのに


char a='{';と 


シングルクォーテーション' 'でくくるのは


半角英数字


a

b


'a'

'b'


と記述するのと同じです。


{の画像データに割り振られた番号、アスキーコードは123でした。




アスキーコード123を


           🍊%c出力変換指定子を用いて🍊


printf出力表示すると


アスキーコード123に対応する画像データである{


がコマンドプロンプト画面に表示されます。


そのプログラムはこちらです」

👇


#include<stdio.h>


int main(void)

{

char a=123;


printf("%c",a);


return 0;

}


プログラムの実行結果


{



アレサ


「ここでプログラムを変更して


123をchar型の変数aでなく

123をint型の変数aに格納してみます。


char a=123;

の命令文を

int a=123;


に変更してみます


#include<stdio.h>


int main(void)

{

int a=123;


printf("%c",a);


return 0;

}


プログラムの実行結果


{


アレサ「このように


char a=123;

と数値データ123がchar型の変数に格納されていても


int a=123;

と数値データ123がint型の変数に格納されていても


数値データ123を%c出力変換指定子を用いてprintf出力表示すると


同じ{ が出力されますね。


数値データが


char型に格納されている


int型に格納されているにかかわらず


  🍓%c出力変換指定子を用いて数値をprintf出力表示した場合🍓


    🍓 その数値データに対応する半角文字の画像データが🍓


    🍓コマンドプロンプト画面に出力されるのですの🍓


なぜなら


数値データが


char型(1バイト)の形式でメモリに格納されている


int型(4バイト)の形式でメモリに格納されているにかかわらず


🍓%c出力変換指定子を用いて数値をprintf出力表示する場合🍓


データ処理の関係上


その数値データは新たにint型(4バイト)の形式でメモリに格納されることになるからです


char型(1バイト)の変数aに数値データ1が格納されるときは


1バイトのメモリに


00000001


と格納されますが


printf("%c",a);


が実行されるときは


別の4バイトのメモリに


00000000000000000000000000000001


に格納し直されます


次に


char型の変数aの数値データ格納範囲は-127から128までですが


その範囲をこえる

12777777773


char=a;

a=12777777773;


と記述し


char型の変数a


に格納してみます。


そして変数aを


%c出力変換指定子をもちいてprintf出力表示してみます。


#include<stdio.h>


int main(void)

{

char a=12777777773;


printf("%c",a);


return 0;

}


プログラムの実行結果


m


変数の型charの数値データ格納範囲-127から128を超えて


12777777773を変数の型charに


char a=12777777773;


とうちこんでいるのに


エラー overflow(メモリにデータが格納しきれず他のメモリにデータが溢れています)と表示されず


プログラムが実行できています。


そして


半角文字1文字mがコマンドプロンプト画面に表示されています


これは


1277777777は


2進数で表示すると


001011111001100111010110101001101101


なのですが


右から8ビット分の


01101101までしか


char型のメモリに格納できなかったためにおこる現象です。


01101101



数値データ109を表しており


char a=12777777773;


printf("%c",a);



char a=109;


printf("%c",a);


を実行することに等しくなります


実際に


char a=12777777773;

printf("%c",a);

でなく


char a=109;

printf("%c",a);


を実行してみると


プログラムの実行結果


mが表示されます」


ソーラー「そうだったのか 


なんでmが表示されるのか


やっとわかったよ~」




おまけ


日本語(漢字やひらがなやカタカナ)のような全角文字は


2バイト文字と呼ばれます。


2バイト文字とは


2バイト(16ビット)分のデータ量


例えば

0もしくは1が16個用いられた

1100110011111111

をもちます


2バイト文字の画像データには


それぞれに


このような

1100110011111111

のようなデータが割り振られており


この

1100110011111111


を用いて


2バイト文字の画像データを呼び出し利用することができます


ですので


1バイト=8ビットまでしか格納できない


char 型に


2バイト文字を


格納することはできません。


ためしに以下のプログラムのように


char 型の変数aに2バイトのデータ量をもつ2バイト文字である




「'て'」のように記述して


char a='て';


と代入し


"%c出力変換指定子をもちいて


printf出力表示しようとしても



#include<stdio.h>


int main(void)

{

char a='て';


printf("%c\n",a);


return 0;

}


プログラミングの実行結果(EAZY IDECの場合)


ファイル「C:/Users/solarplexus/AppData/Local/EasyIDEC/project/11111/main.c」の

「5行目」で記述エラーを発見しました。

警告

multi-character character constant



エラーが表示されます


multi-character character constantは


英語で


複数の文字でつくられた定数という意味です。


1つの文字は最低でも1バイトのデータ量を持つので


複数の文字でつくられた定数は


2バイト以上のデータ量をもっています。


シングルクオーテーション' '内には


半角英数字、1文字(1バイト文字)しか格納できないところを


(半角英数字記号は1バイト文字と呼ばれています。)


2バイトのデータ量をもつ複数文字にあたる


         て



'て'のように格納しようとしたので


(て は 2バイト文字とよばれています)


エラーが表示されたのです


それに対し


統合開発環境Visual studioの場合


プログラムの実行結果



となります


Visual studioでは


'て'


を文字データとして認識しているようですね


ひらがな て 


は2バイト文字なので


コンピュータのメモリの中で


例えば


1010101111110101


のように


2バイトのデータであらわされています


1010101111110101



ての画像データにつけられている番号なのです



char型は1バイトのデータ量しか


格納できないので


char型に


2バイトのデータ量1010101111110101を持つ


2バイト文字である


     'て'


を格納しようとすると


統合開発環境Visual Studioの場合


1010101111110101


の右から1バイト分の11110101だけが


変数の型charに格納されます


そうして


メモリ内に格納された11110101を%c出力変換指定子を用いて


printf出力表示すると


11110101に対応する画像データ



がコマンドプロンプト画面に表示されるというわけです


統合開発環境EAZY IDECと

統合開発環境Visual Studioで


違いがでてきましたね。」










  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る