質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
char

charは文字データ型を指します。一文字分の文字コードの格納を想定としている型です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ASCII

ASCIIは、米国規格協会(ANSI)が制定したコンピューターの情報交換のための文字コードの一つ。アルファベットや数字などを1文字当たり7ビットで表します。英数字を表示する文字コードの中で最も高い互換性を持ち、多くの通信機器に利用されています。

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

3回答

986閲覧

C言語 ASCIIコードや二項演算子について

dsajkldf

総合スコア5

char

charは文字データ型を指します。一文字分の文字コードの格納を想定としている型です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ASCII

ASCIIは、米国規格協会(ANSI)が制定したコンピューターの情報交換のための文字コードの一つ。アルファベットや数字などを1文字当たり7ビットで表します。英数字を表示する文字コードの中で最も高い互換性を持ち、多くの通信機器に利用されています。

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

0クリップ

投稿2021/08/18 09:34

編集2021/08/19 21:59

C言語入門者です。

char型を整数型として、
char型でscanfで入力受付をすると

scanf("%hhd",&変数名);

と書くのは理解できるのですが、この%hhdというのは1バイトすなわちchar型と同じビット数で、書くのは理解できますが、

ASCIIコードというのは127の文字コードを読み取れるのであって、128以上を読み込もうとすると-の値になったりもします。

そんな中で、試したソースコードがあるのですが、

〇試したソースコード

C

1#include<stdio.h> 2int main(void) { 3 4 char num1, num2; 5 6 printf("数字を2つ入力してください。\n"); 7 scanf("%hhd%hhd", &num1, &num2); 8 printf("num1=%hhd num2=%hhd\n", num1, num2); //数字の入力 9 printf("num1==num2・・・%hhd\n", num1 == num2); 10 printf("データサイズは%hhdバイト\n\n", sizeof(num1)); 11 12 return 0; 13}

〇実行結果

数字を2つ入力してください。
10
5
num1=10 num2=5
num1==num2・・・0
データサイズは1バイト

と出ます。

なぜ文字化けなどせずにエラーも起きなく正常に動くのかが不思議なんです。

まだ始めたばかりなので、色々と疑問に思う事はたくさんあるのですが、

現状の僕の考えだと、==という二項演算子はASCIIコードの61と61を二つ使っているので、
%hhdに61と61を格納するには1バイト格納することができなくパンクして、エラーが吐くのではないかと、思ってしまうのです。

演算子が'<'や'+'や'%'で%hhdで表せれるのは納得できますが、なぜ、"=="や"<="などはエラーを吐かずに表せるのでしょうか?

そもそもint型にすれば問題ない話なのですが、どうにも気になり、質問させて頂きました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2021/08/18 09:59

全体的に何言ってるのかわかりません. > ASCIIコードというのは… という文が唐突に出てきますが,直前との繋がりがわかりませんし,後段のコードにも ASCIIコード は何ら関係ないように思えます. (一体何の話が どうしていきなり 始まったのか?) > ==という二項演算子はASCIIコードの61と61を二つ使っているので… 61って何ですか? 直前までの話にはそんな値は全く出てきていないのに,唐突に61とか言われても意味不明です. そして,それ以降の文については何言っているのかが本当に読み取れません.
fana

2021/08/18 10:09 編集

ひょっとして「61」ってのは, '=' のASCIIコード値か? しかし,ソースコード内のある文字の文字コード値が61だったとして,一体それが何だというのか??? ソースコードのどこかに int a = 5; とか書いたら,ここにも '=' が出てきちゃうけど,その文字コード値が61だったら何かとんでもない問題を引き起こすの??? ? ?? ????
dsajkldf

2021/08/18 10:16 編集

回答ありがとうございます。 早くなれるように頑張ります。 はい[61]とはASCIIコード値です。 まだまだ未熟で変な質問をしました。 意味不明な質問をして申し訳ございませんでした。
fana

2021/08/18 10:20 編集

いや,(可能であれば最初から意味が分かる方が良いけども) 意味が伝わらないのは読み手側たる私の頭のせいかもしれないわけですから,そこで謝る必要は無いです. 何が 懸念点であったり,解決すべき課題であるのか? というのを把握できない読み手が現れてしまったわけで,それに対して,もっとわかりやすい形に文面を修正するなどの対応はできませんか? という話です. 話の内容を共有するために. (すでに回答が付いてますけど,それが質問に対してかみ合っているのかどうかもよくわからないですし)
dsajkldf

2021/08/18 10:33

はい。 これからは文章を書く際に気を付けたいと思います。 質問に対してかみ合っていないとのことですが、今後みなさまに皆様に僕の意見も伝わりやすくするために、頑張って直します。 アドバイスありがとうございます。
fana

2021/08/18 10:33

> ...と書くのは理解できるのですが… のあたりから「本当かな?」と復習してみた方がよいのかもしれません. 「ここは理解できている」という前提の上で話が進んでいるわけですが,その前提としている理解自体が間違っているために,それに基づいて考えている諸々が全ておかしな話になっているように見えます.
fana

2021/08/18 10:36

> 質問に対してかみ合っていないとのことですが いいえ, 「私が質問内容を正確に把握できていないので,かみ合っているのかいないのか?の判断すら,私にはできない状況にあります」 ということです.
dsajkldf

2021/08/18 10:38

アドバイスありがとうございます。 復習もちゃんと大事にします。 ソースコードを書きあげたら、一度見直しをした方が良いですね。
kazuma-s

2021/08/18 23:06

意味不明な「`」が多数あるためコンパイルエラーになります。修正をお願いします。
guest

回答3

0

まず%hhdというのは何か値を「格納」する変数などではありません。
printfという関数に渡す書式文字列の一部であるだけです。
printfは、この書式文字列で%hhdを見つけたときに、引数から1つ取り出して、それをchar型の値とみなして10進表記で表示します。

投稿2021/08/18 09:42

itagagaki

総合スコア8402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dsajkldf

2021/08/18 10:10

回答ありがとうございます。 確かに考えてみれば、格納するわけではなく、変数から引っ張り出していますもんね。 アドバイスありがとうございます。
guest

0

ベストアンサー

現状の僕の考えだと、==という二項演算子はASCIIコードの61と61を二つ使っているので、

%hhdに61と61を格納するには1バイト格納することができなくパンクして、エラーが吐くのではないかと、思ってしまうのです。

2つの意味でおかしいです。

  • まず、比較演算の結果は「等しい」か「等しくない」かなので、その気になれば1ビットで表すことができます。比較対象がどれだけの大きさがあろうが、それは無関係です。
  • printfcharを渡した場合、変換が入って、実際にはintが渡っています。比較演算の結果も0か1のintなので、%hhdで受け取ることが可能です(意味的には%dのほうが妥当ですが)。

投稿2021/08/18 09:39

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dsajkldf

2021/08/18 10:28

回答ありがとうございます。 僕の見落としでした。 そもそも式が持っている値というのは0か1だけなので、ASCIIコードなど関係ありませんでした。すみませんでした。 二つ目のアドバイスは 実際にはprintfにcharを渡すと実際にはintが入っており、本来はint型ですが、それを%hhdで値をchar型にしたというわけですね。 分かりやすい回答ありがとうございます。 助かりました。
guest

0

char型でscanfで入力受付をすると scanf("%hhd",変数名); と書くのは理解できるのですが

この時点で理解できていません。

char 型に対応する書式指定は %c です。

投稿2021/08/18 10:13

mather

総合スコア6753

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/08/18 10:17

char型を「数値として」使う場合は%hhdで正解です(&が抜けているという問題はありますが)。
mather

2021/08/18 10:28

なるほど。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問