プログラミング言語C – 文字列リテラル、基本型
![株式会社クローバーフィールドの経営理念](https://www.cloverfield.co.jp/wp/wp-content/uploads/2018/10/cropped-cfilogo-1-150x150.png)
津路です。
引き続き、プログラミング言語C 第2版 ANSI規格準拠 K&R著(共立出版)を読んで、気になるところを書いています。
「隣接している文字列リテラルは、単一の文字列に連結される。」
これは、例えば、
char *a = "abc" "def";
と書くと、
“abcdef” に連結されるということです。
この機能は、例えば、長い文字列を行をまたがって書いたり、あるいはdefineした文字列と混ぜて定義するのに使えます。
#define NAME "John"
char *a = "This is my kidding "
"literature test "
"strings.";
char *b = "His name is " NAME;
ここでは、ワイド文字列 wchar_t を幅広文字列と言っています。普通文字列とワイド文字列を連結した場合は、不定だと書かれていますので、確認してから使う必要があります。
A4.2 基本型
「char型の次には、short int, int, long int と宣言される3種までの大きさの整数がある。ただの int オブジェクトはホストマシンのアーキテクチャで提供される自然の大きさをもつ整数である。他のサイズは特殊な用途のために用意される。」
とありますが、原文を見ると、「Besides the char types, 」とあるので、
「char型の他に」という意味で、
「ただの int オブジェクトは、。。。」については、アーキテクチャによってサイズが変わる可能性を示唆します。
「他のサイズは、。。」は、short int, long int を指すということで、ここでも明確には述べられていません。
次に、
「より長い整数は、より短い整数と少なくとも同じメモリを必要とするが、処理系によっては、単なる整数が、短い整数あるいは長い整数のいずれかに等しいことがある。」
この文章は、ちょっとわかりにくかったです。
原文「Longer integers provide at least as much storage as shorter ones, but the implementation may make plain integers equivalent to either. short integers, or long integers.」
長い方は、long int で、他のshort int, intの記憶容量と同じサイズ以上を提供するが、処理系によっては、素のint は、short int, long int いずれかと同等のサイズになるかもしれない。
といった意味でしょうから、ここでもサイズはあいまいです。
次に、
「一方、キーワード unsigned を使って宣言される符号なし整数は、nをこの表現のビット数とすると、2のn階乗を法とした算術法則にしたがう。したがって符号なしの量の計算ではオーバーフローは決して生じない。一つの符号つきオブジェクトの中に格納できる負でない値の集合は対応する符号なしオブジェクトの中に格納できる値のサブセットであり、オーバーラップする値の表現は同じである。」
ここは、結構難しい表現です。
上で述べた符号付き整数と比較して、unsigned int とすると、2のn階乗の合同算術に従うので、整数計算においてオーバーフローしないといった意味でしょう。後半は、「一つの符号付きオブジェクトの中に格納できる、負でない値の集合は、対応する符号なしオブジェクトの中に格納できる値のサブセットであり、重複する値の表現は同じとなる。」
というふうに、読点を入れないと難しく感じます。符号付きであれば、負の部分と負でない部分があり、後者の値の持ち方は、符号なしと同じといった意味でしょう。