アプリ版:「スタンプのみでお礼する」機能のリリースについて

https://project-flora.net/2015/07/21/cc%E3%81%AB …
こちらのサイトにあるように、
char ≦ short ≦ int ≦ long ≦ long long
しか規約上定まっていないというのは、本当ですか?
char=8bit ですら定まっていないのであれば、安易に unsigned char c = 'A' などとすることもNGなのでしょうか。(言語上。実装上問題の起こることは皆無というのは分かっていますが)

もしよろしければ、C言語の歴史と、言語仕様書の参照方法、現在のC言語の実情を教えていただけると、勉強になります。

A 回答 (5件)

>規約上定まっていないというのは、本当ですか?


規格書を呼んだことが無いので本当かどうかは知らないのですが
データ型モデルによってint型等のサイズが変わってしまうというのは知っています
そう考えると、規格書にサイズを書くのは無理だと考えれば
各型のサイズも決まっていないのだろうなと予想できます

>安易に unsigned char c = 'A' などとすることもNGなのでしょうか。
char型のサイズが変わるというのは聞いたことありませんし
そもそも最低単位の1byteのビット数が変わるなんてことはありえませんでしょうから
NGなんてことは無いでしょうけど
移植性などをより向上させることを考えるのであれば
int8_tやuint8_t の型をなるべく使うべきだとは思います

>言語仕様書の参照方法
https://www.k-cube.co.jp/wakaba/server/func/cstd …
手軽に手に入れられるものでもないし
ぶっちゃけ読む必要も無いものです(暴論)


私もまだまだC言語初心者のため
あまり詳しくは回答できません、ごめんなさい
より専門的な回答が欲しい場合はここではなくて
https://teratail.com/
ここで質問することをおすすめします
    • good
    • 1
この回答へのお礼

なるほど…
技術者の質問ができるところもあったのですね。
ありがとうございます。

お礼日時:2020/04/28 00:21

仕様書 読むだけなら、無料で読む方法はありますし、


多くの方が解説をしています。
とりあえず「 c language specification 」あたりで検索してみましょう。

・sizeof(char) = 1
・limit.hのCHAR_BITは8以上 →つまり、charは8bit以上

と仕様書にあるので「 unsigned char c = 'A' などとすることもNG」なんてことはさすがにありません。



現在は
short=16bit, int=32bit
みたいになっていますが、昔の8bitCPUや16bitCPUがメインだったころは
short=8, int=16bit
等もありました。
    • good
    • 0
この回答へのお礼

ありがとうございます。
ぜひ仕様書は確認しておきたいのですが、規格書にも年代別にバージョン?があるようで、現在のコンパイラはどの規格書を基にしているのか、読む必要のないバージョンはあるのか、といったところが中々情報が見つからないです。

また、https://postd.cc/so-you-think-you-know-c/ こちらのサイトでは char = 6bit (第3問の解説部)なプラットフォームもあったということですが、古い規格書では char 型の最低サイズの定めがなかったのでしょうかね。

何はともあれ、お二方の回答は非常に参考になりました。
ぜひ、仕様書を読もうと思います。

お礼日時:2020/04/28 00:27

「規約」じゃなくて「規格」の話であれば本当.



汎整数型の大きさで規格上決まっているのは
・char ≦ short ≦ int ≦ long ≦ long long (signed, unsigned はあってもなくても同じ)
・char, short, long, long long はそれぞれ 8, 16, 32, 64ビット以上 (直接言及されているのは char のみだが, 他の型についても「必ず格納できなければならない値」の範囲の都合上こうしないといけない)
・char は必ず 1バイト
だけ.

英数字といくつかの記号は「基本ソース文字集合」と「基本実行文字集合」の両方に含まれ, そのような文字については
1バイトに収まる
ことが保証されているので, 「1バイト」である unsigned char の変数に格納できる. つまり
unsigned char c = 'A';
は合法.

なお, 「バイト」は「アドレスの付く最小の単位」なので, 逆にいうと
1つのアドレスで 12ビットが参照できる
ような環境では「1バイト = 12ビット」となったりもする. 「1バイト = 9ビット」は環境としてありえる... かな?

C++ では 20 になって「符号付き整数は 2の補数限定」になる模様.
    • good
    • 1
この回答へのお礼

ありがとうございます。
仕様書を参照します。

お礼日時:2020/04/28 22:21

>char=8bit ですら定まっていないのであれば、安易に unsigned char c = 'A' などとすることもNGなのでしょうか。



話が逆の気がします。

他の回答者の通り、char はその環境で1文字分のデータが記憶できるデータサイズと決められていると思いますので、
8ビットかどうかは問題ではなく、例えば、
 1文字6bitで扱う環境であれば、char=6bit以上
 1文字12bitで扱う環境であれば、char=12bit以上
が保証されていることになると思います。つまり、C言語の利用者は1文字が何ビットかを意識することなく、安心してunsigned char c = 'A' とプログラミングできるようになっていますよ。

int も同じ。その環境で最も効率よく扱えるデータサイズと決められているので、実際に何ビットにするかはコンパイラ次第ですが、8ビットマシンなら8ビット、16ビットマシンなら16ビットのことが多いです。
その環境で扱えない内容、例えば、
int i = 65537;
は32ビットマシンならOKだが、8ビット、16ビットマシンでは不可、
int i = 10000000000000000000000000;
はほとんどのマシンで不可
ということです
    • good
    • 0
この回答へのお礼

ありがとうございます。
仕様書を参照します。

お礼日時:2020/04/28 22:22

「現在のコンパイラはどの規格書を基にしているのか」については


使うコンパイラに聞いてください
としかいえないなぁ. 規格の範囲では
__STDC_VERSION__
というマクロが (C90 への増補で) 定義されているので,
・このマクロがなければ C90
・あればその値で決まるバージョン
になる... はずなんだけど, Cコンパイラについてやる気のない会社が作った処理系のように「C++ と共用できる部分だけ追加実装している」なんてこともある.

それから「char = 6 bit」は最初の規格でもアウトのはずなので, 規格以前の「太古の処理系」に限定されると思う. あと
int i = 65537;
は int (の有効桁) が 17ビット以上ないと未定義動作.
unsigned int i = 65537;
なら問題ない.
    • good
    • 0
この回答へのお礼

ありがとうございました。
仕様書を参照します。

お礼日時:2020/04/28 22:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!