おことわり: この記事では「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 interpretchar
s 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 asfloat
s 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
は、次のよう記述されていました:
/* 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)で同関数を記述すると次のようになります:
unsigned int max(unsigned int a, unsigned int b)
{
if (a > b)
return a;
return b;
}
適当に明日以降につづきます。