(14)[C] 基本データ型と基本演算

[ トップ | 目次 | 前ページ | 次ページ ]


プログラムを書くには種々のデータを種々の型で表現する必要がある。今回は、他の種々の構造を構成していく基底となる基本型の種類、その表現、操作法を学ぶ。

Cの基本型

Cの基本型宣言を理解するために,C言語の基本を思いだそう.Cでは,変数はメモリー領域に付けられた名前であり,その型はメモリー領域の使用方法の指定である.メモリー領域の使用方法は,

  • 大きさ
  • 表現の種類

できまる.Cの基本型は,計算機の基本操作の対象となる大きさと表現の指定と考えると理解しやすい.

基本型指定子に以下のものが定義されている.

構成子名 意味通常の大きさ補足
int 符合付き整数表現 32ビット
short 小さい整数表現 16ビット short intとして使用.intは省略可
long 大きい整数表現 32ビット long intとして使用.intは省略可
char 文字列 8ビット
unsigned 符合無し表現 char, int, long, shortの修飾として用いる
float 単精度浮動小数点 32ビット
double 倍精度浮動小数点 64ビット

これらはいずれも,計算機の命令で直接操作できるメモリーの単位と表現である.これらに対して,配列や構造体などのデータ構造は計算機の命令の操作単位に対応しないので,基本型ではない.特に文字列データも,あらかじめ決められた大きさとメモリーの表現を持たないので,Cでは基本型ではない.

なお,大きさは処理系依存である.以上の値は,通常のPC(32ビットマシン)上で本チュートリアルで構築した環境での値である.各基本型の変数の大きさは以下のプログラムを実行して表示することができる.

#include <stdio.h>
main(){
  printf("Size of char : %d\n", sizeof(char));
  printf("Size of short : %d\n", sizeof(short));
  printf("Size of int : %d\n", sizeof(int));
  printf("Size of long : %d\n", sizeof(long));
  printf("Size of float : %d\n", sizeof(float));
  printf("Size of double : %d\n", sizeof(double));
}

sizeof(ty)は型tyに割り当てられる領域の大きさをバイト(8ビット)単位で返す式である.このプログラムを実行すると以下のような結果となる.

C:\SMLSharpAndC\c>gcc size.c
gcc size.c

C:\SMLSharpAndC\c>a.exe
a.exe
Size of char : 1
Size of short : 2
Size of int : 4
Size of long : 4
Size of float : 4
Size of double : 8

具体的な型宣言の例.

意味
int x; xは32ビット整数型変数
unsigned long x; xは32ビット符合無し整数型変数
char x; xは文字型変数
unsigne char x; xは符合無し文字型変数
double x; xは倍精度不動小数点変数

基本型データの演算

基本型に対して以下のような演算が定義されている.

意味対象となる基本型
a + b 加算 int (各種), unsigned (各種), float, double
a - b 減算 int (各種), unsigned (各種), float, double
a * b 乗算 int (各種), unsigned (各種), float, double
a / b 除算 int (各種), unsigned (各種), float, double
a % b aをbで割った余り int (各種), unsigned (各種)
a++ 1加える int (各種), unsigned (各種), float, double
++a 1加える int (各種), unsigned (各種), float, double
a-- 1引く int (各種), unsigned (各種), float, double
--a 1引く int (各種), unsigned (各種), float, double
a << b aをbビット左シフト int (各種), unsigned (各種)
a >> b aをbビット右シフト int (各種), unsigned (各種)
a & b aとbのビット毎の論理積 int (各種), unsigned (各種)
a ! b aとbのビット毎の論理和 int (各種), unsigned (各種)
~a ビットの反転 int (各種), unsigned (各種)

補足.

  • Cの型は領域の大きさと表現の指定であり,メモリー表現が合えば演算が実行される.例えばchar型の意図は文字の表現であるが,メモリー表現は2進数であるので,2進数表現に対して可能な演算を適用できる.int(各種)は符合付き整数とみなせる型であり,char, short, int, longを含む.
  • 四則演算はint(char,short,long)型に対しては2の補数表現の符合付き数としての演算,unsignedの演算は四則演算は2進数としての演算となる.
  • ++aの値はaへの加算を実行する前の値.a++の値はaへの加算を実行した後の値.--a, a++も同様.
  • シフト演算は,int(char,short,long)型に対しては符合ビットが拡張される符合拡張(すなわち右シフトの場合同一符合でうめられる)シフト,unsigned型に対しては論理シフトとなる.

基本型データの表示

基本データは,printf文に種々の表示形式を指定することによって表示できる.以前整数型をプリントするためには,以下の形式のように指定した.

printf("factorial (1) : %d\n", factorial(10));

この中の%dが表示形式の指定である.このように%記号の後に以型の種類を指定することによって種々の形式の表示が可能である.良く使うものは以下の通りである.

型指定子表現対応する型
%c文字char
%d符合付き十進数表現char, short, int
%u符合無し十進数表現unsigned 各種
%o8進数表現int 各種, unsigned 各種
%x16進数表現int 各種, unsigned 各種
%f十進数小数点表現float, double
%ex.xxxEyyの形の指数部付き十進数小数点folat, double

以下は簡単な演算と表示の例である.

#include <stdio.h>
main(){
  char c1 = 'A', c2 = 'B';
  int i1 = 4, i2 = -2;
  unsigned u1 = 4, u2 = 0xfffffffe;
  double d1 = 1.1, d2 = 2.2;

  printf("c1 : %c\n",c1);
  printf("c1 : %d\n",c1);
  printf("c2 : %c\n",c2);
  printf("c2 : %d\n",c2);
  printf("i1 : %d\n",i1);
  printf("i2 : %d\n",i2);
  printf("u1 : %u\n",u1);
  printf("u2 : %u\n",u2);
  printf("d1 : %f\n",d1);
  printf("d2 : %f\n",d2);
  printf("c1++ as char : %c\n",c1++);
  printf("++c1 as int : %d\n",++c1);
  printf("i1 + i2 : %d\n",i1 + i2);
  printf("u1 + u2 : %u\n",u1 + u2);
  printf("i1 - i2 : %d\n",i1 - i2);
  printf("u1 - u2 : %u\n",u1 - u2);
  printf("c2 - c1 : %d\n",c2 - c1);
  printf("i1 %% i2 : %d\n",i1 % i2);
  printf("i2 << 1 : %d\n",i2 << 1);
  printf("u2 << 1 : %u\n",u2 << 1);
  printf("i2 >> 1 : %d\n",i2 >> 1);
  printf("u2 >> 1 : %u\n",u2 >> 1);
  printf("u1 & u2 : %u\n",u1 & u2);
  printf("u1 | u2 : %u\n",u1 | u2);
  printf("~u1 : %x\n", ~u1);
}

0xfffffffeは16進数による初期値の指定である.-2と同一の表現を持つ.これを実行すると以下のような出力が得られる.

C:\SMLSharpAndC\c>gcc op2.c
gcc op2.c

C:\SMLSharpAndC\c>a.exe
a.exe
c1 : A
c1 : 65
c2 : B
c2 : 66
i1 : 4
i2 : -2
u1 : 4
u2 : 4294967294
d1 : 1.100000
d2 : 2.200000
c1++ as char : A
++c1 as int : 67
i1 + i2 : 2
u1 + u2 : 2
i1 - i2 : 6
u1 - u2 : 6
c2 - c1 : -1
i1 % i2 : 0
i2 << 1 : -4
u2 << 1 : 4294967292
i2 >> 1 : -1
u2 >> 1 : 2147483647
u1 & u2 : 4
u1 | u2 : 4294967294
~u1 : fffffffb

[ トップ | 目次 | 前ページ | 次ページ ]