C言語編 第20章 数値の大きさと符号

先頭へ戻る

この章の概要

この章の概要です。

sizeof演算子

この章では、ある型が表現できる値の範囲について確認します。その話を始める前にまずは、これまであまり深入りせずに使用してきた sizeof演算子について説明しておきます。

「sizeof」に続けて、( ) で囲まれた型名か、式を記述すると、型に応じた大きさがバイト単位で得られます。式の場合は、( ) で囲んでも、囲まずに空白で区切るのでも構いませんが、( ) で囲む方が一般的かと思います。

size_t a;
a = sizeof(int);

int num = 0;
a = sizeof(num);
a = sizeof num;    /* 上の行と同じ意味 */

sizeof演算子に与える式の部分は評価されません。例えば、「sizeof(func())」のように使用したとしても、func関数が呼び出されることはありません。この場合、func関数の戻り値の型に応じて、その大きさが得られます(そのため、func関数の戻り値型が void の場合、コンパイルエラーになります)。

C99 で追加された可変長配列(第25章)の場合だけは例外です。式の型が可変長配列型の場合は、式の評価を行います。

sizeof演算子で得られる値は、size_t型の定数です。size_t型は整数を扱う型ですが、その中でも特に、符号無し整数というものに該当します(これは後ほど取り上げます)。

size_t型は、標準ライブラリの中で定義されているため、使用するためには #include で取り込む必要があります。stddef.h をはじめとして、幾つかの標準ヘッダで定義されています。stdio.h でも定義されているため、大抵はあまり意識せずに使用できます。

符号無し整数の値を、printf関数で出力する場合には、変換指定子を "%d" ではなく "%u" とします。

#include <stdio.h>

int main(void)
{
    printf( "int型の大きさは %uByte\n", sizeof(int) );

    return 0;
}

実行結果:

int型の大きさは 4Byte

size_t型は、符号無し整数であることは保証されているものの、その大きさについての保証はなく、コンパイラによって異なります。そのため、"%lu" のように、変換修飾子(後述)付きの変換指定子を指定したり、unsigned int型にキャスト(第21章参照)したりする必要があるかも知れません。C99 であれば、"%zu" を使うのが良いです。

C99 (printf関数、scanf関数での size_t型の扱い)

C99 では、size_t型を printf関数や scanf関数で使用する際には、"%zu" という変換指定を使います。"%zu" は size_t型を扱うための専用の変換指定です。

#include <stdio.h>

int main(void)
{
    printf( "int型の大きさは %zuByte\n", sizeof(int) );

    return 0;
}

実行結果:

int型の大きさは 4Byte

int型の大きさ

これまで、整数を扱うために int型の変数を利用してきました。int型は、正の数も負の数も扱うことができた訳ですが、扱える数の上限値と下限値があります。コンピュータにデータを覚えさせている以上、当然、無限に数を扱うことはできません。

扱える数の範囲は、その型の大きさによって決まります。しかし、int型の大きさが具体的にいくつなのかは、明確に定義されておらず、コンパイラによって異なります。

int型が 32ビットの大きさを持つコンパイラが多いですが、そうとは限らないのです。仮に 32ビットであるとすれば、232通りの数が扱えます。これは、4,294,967,295 という非常に大きい数ですが、実際には、正と負の両方を保持できる必要があるので、この半分にあたる -2,147,483,647~+2,147,483,647 が、32ビットの int型が扱える範囲となります

大きさが定義されていないのでは、どこまでの値が使えるか分からないので困ってしまいますが、int型の大きさは、最低でも 16ビットあることだけは保証されています。16ビットというと、扱える値の範囲は、-32767~+32767 です。この範囲内なら、標準規格に従っているコンパイラであれば、確実に表現可能です。

自分が使うコンパイラでは、int型がどのような大きさになっているのかは、きちんと知っておいた方が良いです。そうでないと、怖くて大きい数が扱えません(上限値や下限値を超えてしまったらどうなるかについて、後の項で取り上げています)。

確認方法の1つとして、sizeof演算子で型の大きさを調べる手があります。次のようなプログラムを書いて、実行してみれば、int型の大きさを確認できます。

#include <stdio.h>

int main(void)
{
    printf( "int型の大きさは %uByte\n", sizeof(int) );

    return 0;
}

実行結果:

int型の大きさは 4Byte

通常、1バイトは 8ビットなので、このコンパイラでは int型は 32ビットであることが分かりました。

どちらかというと、上限値や下限値を知りたいと思うかもしれません。これも方法があるので、後で取り上げます

signed と unsigned

int型は、正の数も負の数も扱えます。このように、どちらも正負のどちらも扱える整数型を、符号付き整数型と呼びます。

符号付き整数型であることを明確に示すために、signed というキーワードが用意されています。次の3つの宣言は、いずれも同じ意味になります。

int num;
signed int num;
signed num;

同じ意味なので、わざわざ signed を付けたり、逆に signed とだけ書いたりすることはまずありません。これまで通り、単に int とだけ書けばいいでしょう。

符号付き整数型に対して、正の数だけしか扱えない整数型を、符号無し整数型といいます。符号無し整数型は、unsigned というキーワードを使って表現します。こちらも、int を省略することができるので、次の2つの宣言は、いずれも同じ意味になります。

unsigned int num;
unsigned num;

signed や unsigned を付けても、型の大きさ自体は変わりません。負数を扱う能力を捨ててまで、符号無し整数型を使う理由の1つは、表現できる正の数の範囲を増やすことです。例えば、32ビットの大きさで、正負両方の整数を扱うと、-2,147,483,648~+2,147,483,647 の範囲になりますが、正の方向だけに集中すれば、0~4,294,967,295 まで扱えるという訳です。

符号付き整数型で、負数の方が、正数よりも表現できる範囲が広い(32ビットならば、負数は -2,147,483,648 まで、正数は +2,147,483,647 までというように、負数側が 1 多く表現できる)というような環境が多いですが、これは保証されたものではありません。負数の方が表現範囲が広いのは、負数の表現に 2 の補数という形式を使っているからですが、2 の補数で表現されているかどうかは、コンパイラによって異なるのです。

また、負数になり得ないことを明確に示すために、符号無し整数型を使うこともあります。例えば、年齢は負数になり得ないので、unsigned int型にするといったことが考えられます。

ただ、型の考え方を重要視するC言語では、signed と unsigned を混在して使うと、トラブルに巻き込まれる可能性があります。例えば、signed int型の変数に負数が格納されているとき、その値を unsigned int型の変数へ代入したら、負数ではなくなってしまいます。つまり、ある型で表現可能な値が、他のある型で表現できるとは限らない訳です。

一方で、プログラマには、そのような代入が確実に問題ないことが分かっていることもあります。つまり、signed int型の変数だが、確実に unsigned int型で表現可能な値しか格納していないと、自信を持っていえるケースもあるということです。そのため、このような型の混在自体は、コンパイルエラーにはなりません。

次の例のように、符号無し整数型の定数を記述する場合は、数値の末尾に「U」か「u」を付けます

1234U;

これは整数接尾語と呼ばれる指示で、この後でもう1つ登場します。整数接尾語のない整数定数は、signed int型であるものとして扱われます。


printf関数scanf関数で、符号無し整数型を扱う場合には、変換指定子を "%u" にします。正確には、"%u" は 10進数の符号無し整数型の値を扱います。8進数や 16進数を使う場合は、前章で見たとおり、"%o"、"%x"、"%X" を使います。"%o"、"%x"、"%X" は元々、符号無し整数型を扱う変換指定子です。

short と long

int型の大きさは環境によって異なりますが、short long というキーワードを使うことによって、 大きさの異なる整数型を作り出すことができます。

short int num;
long int num;

このように「int」の手前に、short や long といったキーワードを付け加えます。 あるいは、以下のように「int」を省略しても構いません。

short num;  /* short int と同じ */
long num;   /* long int と同じ */

また、signed や unsigned のいずれかと同時に使うことも可能です。

signed short int num;
unsigned long int num;

組み合わせが多いので全部は挙げませんが、signed と unsigned を同時に使えないことと、 short と long を同時に使えないことを除けば、どのように組み合わせても構いません。 また、signed/unsigned と short/long は、どちらの組が先に来ても構いません。

short signed int num;   /* signed short int と同じ */
long unsigned int num;  /* unsigned long int と同じ */


名前の通り、short は小さめの、long は大きめの型を作るのですが、やはり具体的な大きさは環境によって異なります。 int型が 32ビットであるようなコンパイラの多くは、short int型を 16ビットに、long int型を 32ビットにします。 int型と long型の大きさが同じなのは変な話ですが、規格上定められているのは、 具体的な大きさではなく、最小の大きさです。 規格では、次の表のように定められています(signed については省略していますが、指定しない場合と同じです)。

最小の大きさ 備考
int 16ビット
short 16ビット int型より大きいということはない
long 32ビット int型より小さいということはない
unsigned int 16ビット
unsigned short 16ビット int型より大きいということはない
unsigned long 32ビット int型より小さいということはない

特別、大きさを大小させることに意味がない限り、short型や long型よりも、普通の int型を優先的に使うべきです通常、int型が最も高速に処理できます。 short型の方が小さいから速いと思うかも知れませんが、必ずしも、そのような期待が成り立つとは限りません。

short型を使う価値がある場面は、メモリの使用量を少なく抑えたい場合です。 とはいえ、現在のコンピュータのメモリ容量を考えると、4バイトを 2バイトに抑える程度の節約には何の意味もありません。 ものすごく膨大な数の変数を定義しなければならないプログラムや、マイクロコンピュータのような、 非常にメモリ容量が少ない特殊な環境でもない限りは、素直に int型を使った方が無難です。

long型を使う価値がある場面は、大きな数を扱う必要がある場合です。 コンパイラによっては、int型の大きさは 16ビットしかないため、この大きさで扱えないような大きな数を使いたい場合は、long型を使います。

例えば、int型が 32ビットのコンパイラで作成したプログラムの出来が良かったので、他のコンパイラでも使いまわすことにしたとします。 「他のコンパイラ」の方では、int型が 16ビットしかなかったとすると、大きな数を扱っている箇所で問題が起こる訳です。

次の例のように、long型の定数を記述する場合は、数値の末尾に「L」か「l」を付けます

12345678L;

「U」と同様、これも整数接尾語の一種です。 「U」と同時に指定することもでき、その場合は「UL」でも「LU」でも構いません(もちろん、小文字でも構いません)。 両方を指定すれば、unsigned long型を意味します。
なお、「l」は、「1」と見間違いやすいので「L」を使う方が良いかも知れません。


printf関数や scanf関数などの変換指定子ですが、 short型や long型であることを明示するために、変換修飾子を付加する必要があります。 変換修飾子は、short型なら "%h"、long型なら "%l" です。 これらを、"%d"、"%u"、"%o"、"%x" といった指定と組み合わせて、例えば、"%hd" だとか "%lu" といったように指定します。

このように、変換指定子と変換修飾子(更に、他のものが付くこともあります)をあわせて、変換指定と呼びます。

printf( "%hd\n", sn );    /* short型 */
printf( "%lu\n", uln );   /* unsigned long型 */

long long (C99)

C99 (long long)

C99 には、long よりも更に大きな型を作るために、long long が追加されました。 使い方は、long とまったく同じです。

long long int num;
unsigned long long int num;

long と同様、signed や int の部分は省略できます。また、signed/unsigned のいずれかの指定と、long long の指定は、どちらが前に来ても構いません。

long long型の最小の大きさは 64ビットと定義されています。

long long型の定数を記述する際には、数値の末尾に「LL」か「ll」を付けます。 unsigned を表す「U」「u」とともに使う場合は、どちらが先に来ても構いません。

printf関数や scanf関数などで、long long型の値を使う場合は、変換修飾子 "%ll" と組み合わせます。

printf( "%lld\n", 100LL );    /* long long型 */
printf( "%llu\n", 100ULL );   /* unsigned long long型 */

char型

char型は、1文字を表現するための型で文字型ですが、広くいえば整数型です。

char型の大きさは 1バイトです。正確にいえば、「sizeof(char)」が 1 となることが定義されています。

1バイト が 8ビットとは限らないところに問題が潜んでいますが、そういう非常に特殊な環境のことは考えないことにします。limits.h をインクルードして、CHAR_BIT の値を調べれば、そのコンパイラで、char型が何ビットであるのかが分かります。

char型は、1バイトの整数型ですから、小さな整数であれば表現可能です。また、signed および unsigned を付けることが可能です。

char num;
signed char num;
unsigned char num;

ただ、int型などの他の整数型と違って、char型と signed char型は異なる型ですし、unsigned char型も異なる型です。つまり、上記の3つの宣言は、すべて異なる型の変数を宣言しています。

そして、char型が扱える値の範囲は、コンパイラによって異なります。可能性としては、signed char型相当の値の範囲を扱えるか、unsigned char型相当の値の範囲を扱えるかのいずれかです。

このように、char型関連の事情はかなり複雑です。まずは、char型を整数を扱う目的では使わないのが無難です。char型の本来の役目である、文字を表現することにだけ使うようにしましょう。どうしても 1バイトの整数型が必要な場合は、明示的に signed や unsigned を付けるようにして、値の範囲を明確にしましょう。

C99 (printf関数、scanf関数での char型の扱い)

C99 では、char型を printf関数や scanf関数で使用する際には、"%hh" という変換修飾子を使うことができます。


また、文字定数の型についても注意が必要です。

#include <stdio.h>

int main(void)
{
    char a = 'A';

    printf( "%u\n", sizeof('A') );
    printf( "%u\n", sizeof(a) );

    return 0;
}

実行結果:

4
1

sizeof演算子を使って char型の大きさを調べてみると 1 になりますが、'A' のような文字定数を調べると 4 になっています。 実は、C言語では、文字定数の型は int型です。 実験した環境では int型の大きさが 4バイトなのでこのような結果になりましたが、 int型が 2バイトの環境なら、sizeof('A') も 2 になります。

C++ では、文字定数の型は char型であり、sizeof('A') の結果は常に 1 になります。 これは、C言語と C++ の代表的な非互換な部分です(Modern C++編【言語解説】第2章)。

浮動小数点型

浮動小数点数を扱える型には、float型double型long double型の 3つがあります。

float f;
double f;
long double f;

これらの型の具体的な大きさに関しては、何も既定されていませんが、 多くのコンパイラでは、float型が 4バイト、double型が 8バイトです。 long double型の大きさは差異が大きく、VisualStudio では 8バイト、clang では 16バイトになっています。

浮動小数点数が、具体的にどの程度の範囲の値を扱えるかは、これまた具体的には決まっていません。 それに加えて、浮動小数点数をコンピュータ上で表現する方法自体、結構難しいものですから、ここでは詳しく触れないことにします。

なお、float型で表現できる範囲は、必ず double型で表現でき、 double型で表現できる範囲は、必ず long double型で表現できることになっています

float型の定数には、末尾に「F」か「f」を付け、long double型の場合は「L」か「l」を付けます。 これらは浮動小数点接尾語と呼び、 浮動小数点接尾語を付けない場合には、double型として扱われます

0.1;    /* double型 */
0.1F;   /* float型 */
0.1L;   /* long double型 */

基本的には double型を使うのが良いです。 float型の方が高速に処理できる場合もありますが、こういうものは実行環境によるとしか言いようがありません。 非常に膨大な量の変数が必要な場合に、メモリの節約のために float型を使うことはあるかも知れませんが、 そういう事情が無い限り、double型を使う方がトラブルが少ないと言えます。


printf関数や scanf関数の変換指定ですが、浮動小数点型の場合は、事情が異なることに注意が必要です。

printf関数で、float型や double型の値を使う場合、変換指定子に "%f" を使います。long double型の場合は、変換修飾子 "L" を使用して "%Lf" とします。

printf( "%f\n", 123.45f );    /* float型 */
printf( "%f\n", 123.45 );     /* double型 */
printf( "%Lf\n", 123.45L );   /* long double型 */

一方、scanf関数では、単に "%f" とすると、float型を扱うことを意味します。double型を扱うには "%lf"、long double型には "%Lf" としなければなりません。double型の指定方法が、printf関数と異なることに注意が必要です。

scanf( "%f", &f );     /* float型 */
scanf( "%lf", &d );    /* double型 */
scanf( "%Lf", &ld );   /* long double型 */

C99 (printf関数での "%lf"変換指定について)

C99 以降では、printf関数で double型の値を出力するために、"%lf"変換指定を使用できます。これまで通り、"%f" を使うことも可能で、意味は同じです。

#include <stdio.h>

int main(void)
{
    printf( "%f\n", 123.45 );
    printf( "%lf\n", 123.45 );

    return 0;
}

実行結果:

123.450000
123.450000

科学的記数法

浮動小数点数の表記方法に、科学的記数法というものがあります。 まずは、プログラム例を見て下さい。

#include <stdio.h>

int main(void)
{
    double d1 = 3.141592;
    double d2 = 31.41592;
    double d3 = 0.3141592;

    printf( "%e\n", d1 );
    printf( "%e\n", d2 );
    printf( "%e\n", d3 );

    return 0;
}

実行結果:

3.141592e+000
3.141592e+001
3.141592e-001

printf関数の変換指定子 "%e" を使うと、科学的記数法で出力することができます。 (long double型のときは "%Le" とします)。 実行結果が、科学的記数法で表記した浮動小数点数です。

途中にある「+」は、指数が正であることを表しています。 指数が負なら「-」になります。 「e」は単なる区切りと考えて構いません。

つまり、「3.141592e+000」であれば、3.141592 を 100倍(つまり 1倍)したものという意味になるので 3.141592 のことです。 「3.141592e+001」は、3.141592 を 101倍したものなので、31.41592 を、 「3.141592e-001」なら、3.141592 を 10-1倍(つまり 10分の1)したものなので、0.3141592 を意味しています。 要するに、「e」の後ろの数分だけ、小数点の位置を移動させればいいだけです。

科学的記数法は、ソースコード中でも使うことができます。 その際、表記の途中にある「+」は、指数が正であるのならば省略可能です。 また、先ほどの printf関数の出力結果では「+001」のようになっていますが、これは「+1」のように書いても構いません。
浮動小数点接尾語の付け方にも変化はありません。 次のように、末尾に付けるだけです。

0.3141592e1f;
0.3141592e1L;

C99 (16進数表記の浮動小数点定数)

C99 では、浮動小数点定数を 16進数で表記できるようになりました。 ただし、その際には科学的記数法を使わなければなりません。

#include <stdio.h>

int main(void)
{
    double d = 0x89ab.cdefP2;

    printf( "%a\n", d );
    printf( "%f\n", d );

    return 0;
}

実行結果:

0x8.9abcdefp+14
140975.217712

16進数での科学的記数法では、先頭に 16進数を表す「0x」を付ける他、 「e」を「p (またはP)」に変更します(「e」は 16進数の文字に含まているので区別が付かないためです)。

printf関数や scanf関数に指定する変換指定子は、"%a" または "%A" です。 前者と後者の違いは、「p」の部分が小文字になるか大文字になるかだけです。

この記法は、VisualStudio 2015/2017 では使用できません。

限界値

ここまで見てきて、型の大きさというものがいかに曖昧か分かって頂けたでしょうか? しかしこれでは困ることもあるので、具体的な最小値と最大値を知る方法が用意されています。

次のプログラムを実行すると、各型の限界値(最小値と最大値)が分かります。

#include <stdio.h>
#include <limits.h>
#include <float.h>

int main(void)
{
    printf( "          char型の最小値は %d、最大値は %d\n", CHAR_MIN, CHAR_MAX );
    printf( "   signed char型の最小値は %d、最大値は %d\n", SCHAR_MIN, SCHAR_MAX );
    printf( " unsigned char型の最小値は %u、最大値は %u\n", 0, UCHAR_MAX );
    printf( "\n" );
    printf( "           int型の最小値は %d、最大値は %d\n", INT_MIN, INT_MAX );
    printf( "  unsigned int型の最小値は %u、最大値は %u\n", 0, UINT_MAX );
    printf( "\n" );
    printf( "         short型の最小値は %d、最大値は %d\n", SHRT_MIN, SHRT_MAX );
    printf( "unsigned short型の最小値は %u、最大値は %u\n", 0, USHRT_MAX );
    printf( "\n" );
    printf( "          long型の最小値は %ld、最大値は %ld\n", LONG_MIN, LONG_MAX );
    printf( " unsigned long型の最小値は %lu、最大値は %lu\n", 0, ULONG_MAX );

    printf( "\n" );
    printf( "         float型の最小値は %e、最大値は %e\n", -FLT_MAX, FLT_MAX );
    printf( "\n" );
    printf( "        double型の最小値は %e、最大値は %e\n", -DBL_MAX, DBL_MAX );
    printf( "\n" );
    printf( "   long double型の最小値は %Le、最大値は %Le\n", -LDBL_MAX, LDBL_MAX );

    return 0;
}

実行結果:

          char型の最小値は -128、最大値は 127
   signed char型の最小値は -128、最大値は 127
 unsigned char型の最小値は 0、最大値は 255

           int型の最小値は -2147483648、最大値は 2147483647
  unsigned int型の最小値は 0、最大値は 4294967295

         short型の最小値は -32768、最大値は 32767
unsigned short型の最小値は 0、最大値は 65535

          long型の最小値は -2147483648、最大値は 2147483647
 unsigned long型の最小値は 0、最大値は 4294967295

         float型の最小値は -3.402823e+038、最大値は 3.402823e+038

        double型の最小値は -1.797693e+308、最大値は 1.797693e+308

   long double型の最小値は -1.797693e+308、最大値は 1.797693e+308

出力結果は、使用しているコンパイラによって異なります。

整数型に関する情報を得るためには、limits.h を #include すると使えるようになる機能を使用します。 同様に、浮動小数点型に関する情報は、float.h を #include すると使えるようになる機能を使用します。

例えば、CHAR_MIN は char型で表現できる最小値を、CHAR_MAX は char型で表現できる最大値を表しています。
このように、unsigned でない型の場合には、***_MIN と ***_MAX という感じの名前で定義されています。unsigned な型の場合には、***_MAX の方だけが用意されています(最小値は必ず 0 です)。

浮動小数点型の場合は、***_MIN という名前の値も用意されていますが、これは「表現できる数の中で、0 に一番近い正の数」を表しており、 今回調べようとしている「最小値」とは意味が異なっています。 浮動小数点数の最小値は、最大値の符号を反転させたものと一致するので、***_MAX の方を使います。

最大値の次は?

ところで、最大値の次( +1 )はいくつになるのでしょう? 次のプログラムで試してみましょう。

#include <stdio.h>

int main(void)
{
    short int num = 32767 + 1;
    unsigned short int unum = 65535 + 1;

    printf( "num = %d\n", num );
    printf( "unum = %d\n", unum );

    return 0;
}

実行結果:

num = -32768
unum = 0

警告が出るかも知れませんが、ここでは無視して下さい。 重要なのは実行結果です。

この結果はつまり、「最小値に戻ってきている」ということです。 符号付き整数型の num の方は 巨大な負数になりますし、符号無し整数型の unum の方は 0 になります。

符号無し整数型での最大値は、全てのビットが 1 になった状態です。 例えば、16ビットの符号無し整数型であれば、次のように 16個の 1 が並んだ状態になります。

1111111111111111    /* 符号無し16ビットでの最大値の表現 */

ここに +1 すると、次のように繰り上がりが起きて、17個目のビットだけが 1 のビット列になります。

10000000000000000

しかし、そもそも 16ビット分の大きさしかないので、17桁目はカットされてしまいます。 その結果、次のようになります。

0000000000000000

これは結局、単なる「0」です。 つまり、最大値から最小値へと戻ってきてしまうという訳です。

ここで確認した結果は、符号無し整数であれば保証されたものですが、符号付き整数では保証されません。 限界値を超えてしまうような計算は、その挙動を正確に理解していない限り危険なので、避けるようにした方が良いです。


練習問題

問題① short型、int型、long型の大きさを確認するプログラムを作成して下さい。

問題② 次のプログラムは、あまり適切とは言えません。理由を考えて下さい。

#include <stdio.h>

int main(void)
{
    double i;

    for( i = 0.0; i < 100.0; i += 1.5 ){
        printf( "%.1lf\n", i );
    }

    return 0;
}

問題③ char型が符号付きか、符号無しかを判定するプログラムを作成して下さい。


解答ページはこちら

参考リンク

更新履歴

'2018/5/12 「sizeof演算子」に、式の評価を行わないことについて追記。

'2018/5/4 「sizeof演算子」の項を修正。
- sizeof演算子の ( ) が常に省略できるように説明されていたが、型名の場合は省略できないので、記述とサンプルコードを修正した。
- size_t型が定義されている標準ヘッダについて、コラムを追加。

'2018/5/3 「int型の符号の有無」の項を「signed と unsigned」に修正。

'2018/5/2 「C99 (printf関数での "%lf"変換指定について)」の項を追加。

'2018/4/5 VisualStudio 2013 の対応終了。

≪更に古い更新履歴を展開する≫





前の章へ(第19章 数の表現方法)

次の章へ(第21章 型変換)

C言語編のトップページへ

Programming Place Plus のトップページへ


このエントリーをはてなブックマークに追加
rss1.0 取得ボタン RSS