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言語の実情を教えていただけると、勉強になります。
No.1
- 回答日時:
>規約上定まっていないというのは、本当ですか?
規格書を呼んだことが無いので本当かどうかは知らないのですが
データ型モデルによって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/
ここで質問することをおすすめします
No.2ベストアンサー
- 回答日時:
仕様書 読むだけなら、無料で読む方法はありますし、
多くの方が解説をしています。
とりあえず「 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
等もありました。
ありがとうございます。
ぜひ仕様書は確認しておきたいのですが、規格書にも年代別にバージョン?があるようで、現在のコンパイラはどの規格書を基にしているのか、読む必要のないバージョンはあるのか、といったところが中々情報が見つからないです。
また、https://postd.cc/so-you-think-you-know-c/ こちらのサイトでは char = 6bit (第3問の解説部)なプラットフォームもあったということですが、古い規格書では char 型の最低サイズの定めがなかったのでしょうかね。
何はともあれ、お二方の回答は非常に参考になりました。
ぜひ、仕様書を読もうと思います。
No.3
- 回答日時:
「規約」じゃなくて「規格」の話であれば本当.
汎整数型の大きさで規格上決まっているのは
・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の補数限定」になる模様.
No.4
- 回答日時:
>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;
はほとんどのマシンで不可
ということです
No.5
- 回答日時:
「現在のコンパイラはどの規格書を基にしているのか」については
使うコンパイラに聞いてください
としかいえないなぁ. 規格の範囲では
__STDC_VERSION__
というマクロが (C90 への増補で) 定義されているので,
・このマクロがなければ C90
・あればその値で決まるバージョン
になる... はずなんだけど, Cコンパイラについてやる気のない会社が作った処理系のように「C++ と共用できる部分だけ追加実装している」なんてこともある.
それから「char = 6 bit」は最初の規格でもアウトのはずなので, 規格以前の「太古の処理系」に限定されると思う. あと
int i = 65537;
は int (の有効桁) が 17ビット以上ないと未定義動作.
unsigned int i = 65537;
なら問題ない.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 工学 都市ガスの燃焼速度 3 2022/08/03 12:59
- 実用・教育 その著者まで亡くなられたのですか? 2 2022/07/30 17:55
- その他(家族・家庭) 幼い2人の子は、孤児になるのでしょうか?? 1 2022/07/31 15:01
- 日本語 「使われている」と使い方が違うのは次のどれか 1 2022/07/11 20:08
- 船舶・クルーズ Windows10のエクスプローラにて。 1 2022/10/10 20:11
- 事件・事故 前川喜平氏に疑問「正義の味方みたいになっているけど違法です」…カルトも危険ですが官僚支配も危険ですね 10 2022/08/07 09:24
- 統計学 条件付き独立について 1 2023/06/26 07:50
- その他(音楽・ダンス・舞台芸能) 坂本龍一さんの盗作疑惑を謝罪した韓国歌手への対応が素晴らしい……でも、相手は韓国人ですよ 2 2022/06/24 07:39
- 事件・事故 「ほぼ確実」なのでしょうか。 4 2023/08/28 22:22
- Wi-Fi・無線LAN パソコンの初期設定で分からないことがあります。 4 2022/10/27 21:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のfor文です。 繰り返しの...
-
strchr() の第2引数はなぜ int ...
-
CStringをwchar_tに変換したい
-
_TCHAR*での引数の読み込み
-
間接操作のレベルとは
-
fgetsなどのときのstdinのバッ...
-
c++ 文字列を入力して、一文字...
-
C言語の入力した文字を反転させ...
-
ftoa の作り方
-
標準ライブラリ関数の自作につ...
-
c言語です。
-
ネットワークにつながっている...
-
str系関数を使わずに二つの文字...
-
構造体のアライメント調整
-
間接参照のレベルが異なっています
-
文字列から空白を取り除きたい...
-
起動時の引数の取得方法が分か...
-
コマンドラインに入力されてい...
-
配列をnビットシフトする
-
RGB→YUV変換のプログラム
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
switch文で文字を比較すること...
-
干支のプログラム
-
3桁区切(コンマ)記号をつけ...
-
絶対パスからのファイル名の切...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
型変換
おすすめ情報