2.変数・配列

2-4. データ型の拡張

◆データ型の拡張

今までやってきたデータ型に修飾子を付けてもっと詳しくやって行きたいと思います。

まずは、unsigned から、

修飾子を付ける時の書式は

[修飾子][データ型][変数名];

となります。unsigned の意味は符号無しでわかりやすく言うと負の数がないことをいいます。

unsigned int i;

とした場合、変数iは正の整数になりデータの範囲は、0~65,535(16bitの場合)になります。

ここで補数の解説はしませんが、負の数を使わないぶん正の数の範囲が倍になったと考えていただいて結構です。

ちなみにintの場合、unsignedだけでintの記述を省略することができます。

unsigned int i;
unsigned j; /* これでも良い */

◆int型の拡張

1.short

単純に短いの意味です。大抵データ長が16ビットになります。
16ビットシステムではshortを付けなくても16ビットですが、32ビットシステムでshortを使うときは付ける必要があります。
(基本的に移植性を考えれば面倒でもshortをつけるべき)
shortを使う理由としては大きな数値を使わない場合にメモリの節約になるからです。
特に配列になると差がわかります。(そういえば配列の説明をしてない…)

では宣言の例を

short int i;
short j;

上のとおり int は省略できます。

昨日紹介したunsignedと併用する時は

unsigned short int i;

のように使います。

2.long

今度はshortの反対でlongです。
longを使用するとデータ長が倍になり32ビットになります。
ただし、32ビットシステムではlongを使用してもしなくても32ビットです。

宣言の仕方はshortの時と同じく

long int i;
long j;
unsigned long int k;

のようになります。

3.singed

unsignedに対する修飾子としてsignedがあります。

通常、データ型のほとんどは符号付が標準になっているのでわざわざ使うことも少ないと思います。

これを上の宣言文に加えてみると、

signed short int i;
signed short j;

signed long int k;
signed long l;

となります。

それでは、表示させましょう。

#include<stdio.h>

main()
{
    int c;
      signed short int i=1;
    unsigned short int j=1;

      signed long int k=1;
    unsigned long int l=1;

    printf(" sint=%d\n",sizeof(signed short int));
    printf("usint=%d\n",sizeof(unsigned short int));
    printf(" lint=%d\n",sizeof(signed long int));
    printf("ulint=%d\n\a",sizeof(unsigned long int));
    for(c=1;c<430;i+=100,j+=100,k+=10000000,l+=10000000,c++){
        printf("%8d %8u %12d %12u\n",i,j,k,l);
    }
}

特にプログラムについて解説はしません。結果だけを確認してください。
signed の変数には負になることがありますが unsigned は負になりません。

4.const

これは宣言したオブジェクトを定数として扱うものです。

const によって宣言されたオブジェクトは以後、値の変更ができません。

よって、宣言時に初期化するきまりがあります。

const int i = 10 ; /* 良い例 ○ */
const int i ; /* 初期化してないので × */
i = 10 ; /* 宣言以後の代入不可 × */

constによって書き換えの禁止ができるのでプログラムの安全性があがります。

5.volatile

これは const に対して値が変更できるものです。
代入が行われたとき値の変更が行われ、呼び出しのとき常にメモリへアクセスし現在値を読み込みます。

……volatile について何もつけないデフォルトの時と同じように思うのですがどうなんでしょう?(自分もvolatileが特別なものかどうかがわからない)