Help us understand the problem. What is going on with this article?

Ancient C探訪記:基本型編

More than 1 year has passed since last update.

おことわり: この記事では「1975年頃のC言語」仕様を解説します。2017年現在のC言語仕様とは異なるため、あなたのC言語ライフには役立たないことを予めご承知おきください。

(本投稿は Ancient C探訪記 シリーズの一部です。)

つづいて、プログラムの構成要素である「基本型(fundamental types)」を見ていきます。

Ancient Cの基本型

"C Reference Manual" §4. What’s in a Name? より引用します。4種類の基本型 int, char, float, double が定義されています。

C supports four fundamental types of objects: characters, integers, single-, and double-precision floating-point numbers.

  • Characters (declared, and hereinafter called, char) are chosen from the ASCII set; they occupy the rightmost seven bits of an 8bit byte. It is also possible to interpret chars as signed, 2's complement 8bit numbers.
  • Integers (int) are represented in 16bit 2's complement notation.
  • Single precision floating point (float) quantities have magnitude in the range approximately 10±38 or 0; their precision is 24 bits or about seven decimal digits.
  • Double-precision floating-point (double) quantities have the same range as floats and a precision of 56 bits or about 17 decimal digits.

それぞれ char は8bit文字型(符号有無は任意)、int は符号付き16bit整数型、float は単精度浮動小数点数型(32bit幅)、double は単精度浮動小数点数型(64bit幅)となっています。

標準規格との差分

Ancient Cに加えて、標準規格(ANSI C、C90)では下記の基本型が追加されます。

  • 文字型
    • signed char
    • unsigned char
  • 符号付き整数型
    • (signed) short int
    • (signed) long int
  • 符号なし整数型
    • unsigned short int
    • unsigned int
    • unsigned long int
  • 浮動小数点数型
    • long double

符号なし整数型?

Ancient Cの整数型は、符号付き整数型 int しか定義されません。符号なし整数型を扱いたい場合は、“char * などのポインタ型で代用” していたようです。は??

ポインタ型は非負値をとるメモリアドレスを保持する型ですから、メモリアドレスを整数値とみなすことで符号付き整数型(unsigned int)演算を行うという理屈です。例えば、2つの符号なし整数 a, b のうち最大値を返す関数 max は、次のよう記述されていました:

ancient-max.c
/* Return the logical maximum
 * of the 2 arguments.
 */
max(a, b)
char *a, *b;
{
  if (a > b)
    return(a);
  return(b);
}

Ancient Cの関数宣言は標準Cとは色々と差異があるのですが、ここでは関数パラメータ a, b がポインタ型(char *)として宣言されています。参考までに、標準C(ANSI C、C90)で同関数を記述すると次のようになります:

stdc-max.c
unsigned int max(unsigned int a, unsigned int b)
{
  if (a > b)
    return a;
  return b;
}

適当に明日以降につづきます。

yohhoy
「なんにも知らないって、すっごくしあわせ!」--スヌーピー
https://yohhoy.hatenadiary.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away