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='{';と 


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


半角英数字の場合と同じです。


{の画像データに割り振られた番号、アスキーコードは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出力表示した場合🍓


    🍓 その数値に対応する画像データである🍓

  

     🍓 半角文字が1文字出力されるのですの🍓



そこで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=109;

printf("%c",a);


を実行してみると


コンパイル結果


mが表示されます


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


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


やっとわかったよ~」



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


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


2バイト文字とは


2バイトのデータ量


例えば

1100110011111111

をもち


この

1100110011111111に


対応する画像データなのです。


ですので


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出力表示すると


10101011に対応する画像データ



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


統合開発環境EAZY IDECと

統合開発環境Visual Studioで


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










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

作者を応援しよう!

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

応援したユーザー

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