SML# - Tutorial/013 Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

[ [[トップ |Tutorial]]| [[目次|Tutorial/000]] | [[前ページ|Tutorial/012]] | [[ 次ページ |Tutorial/014]] ]
----
プログラムを書くには種々のデータを種々の型で表現する必要がある。今回は、
他の種々の構造を構成していく基底となる基本型の種類、その表現、操作法を
学ぶ。

!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 各種||
||%o||8進数表現||int 各種, unsigned  各種||
||%x||16進数表現||int 各種, unsigned 各種||
||%f||十進数小数点表現||float, double||
||%e||x.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
----
[ [[トップ |Tutorial]]| [[目次|Tutorial/000]] | [[前ページ|Tutorial/012]] | [[ 次ページ |Tutorial/014]] ]