C語言中,整形變量在不同的編譯環境下,其內存分配的大小是不相同的。ANSI C的標準沒有規定標識符的長度,但各個C編譯系統都有自己的規定。
在C裏的整形變量:short、int、long,要求short型不長於int型,long型不短於int型。在TC環境下,short和int型被分配2字節(word),即16位(bit),long型是4字節,即32位。而在其它編譯環境下int可能會被分配4字節,與long型相同。
如下是各個編譯環境下爲三種整形變量所分配的內存空間:
在Turbo C2.0:int 16、short 16、long 32;
在VC++ 6.0: int 32、short 16、long 32;
在Linux下: int 32、short 16、long 32;
爲了驗證自己所用的編譯器爲三種整形分配多大的內存空間,可以在當前編譯環境下,寫一段測試程序來測量它們的實際大小。
/*
查看C中的變量類型(int、short、long等)在Turbo C 裏的大小。(方法一)
*/
#include "stdio.h"
int main()
{
/*定義三種整形變量,爲int、short的第16位負值1,long的第32位負1,其它位爲0*/
unsigned int n_int=0x8000; /*n_int是int型變量*/
unsigned short n_short=0x8000; /*n_int是short型變量*/
unsigned long n_long=0x80000000; /*n_int是long型變量*/
unsigned size_int=16,size_short=16,size_long=32;
/*假設int、short型最小16位,long型最小是32位*/
while(1) /*默認死循環*/
{
n_int<<=1; /*n_int先左移一位*/
if(n_int!=0) size_int++; /*n_int不爲0,說明原先16位的1沒有溢出,
n_int還有更高位*/
else break; /*n_int爲0,說明最高位1溢出,退出死循環*/
}
while(1) /*同上*/
{
n_short<<=1;
if(n_short!=0) size_short++;
else break;
}
while(1) /*同上*/
{
n_long<<=1;
if(n_long!=0) size_long++;
else break;
}
/*打印出三種類型變量所佔內存的大小*/
printf("In This Suite :/n size_int = %d/n size_short = %d/n size_long = %d/n",size_int,size_short,size_long);
}
在Turbo C下,運行結果:
size_int = 16
size_short = 16
size_long = 32
在VC++_6.0下,運行結果:
size_int = 16
size_short = 32
size_long = 32
在Linux_redhat下,運行結果:
size_int = 16
size_short = 32
size_long = 32
由此可見,在不同編譯環境下,爲三種整形變量分配的字節數量不同,瞭解這些可以防止數據意外溢出,而導致錯誤,但這種錯誤通常編譯器是不會報錯的,這就形成透明錯誤,看不到但確實存在。
測試數據類型大小的方法很多,也可以用下面的方法:
/*
查看C中的變量類型(int、short、long等)在Turbo C 裏的大小。(方法二)
*/
#include "stdio.h"
int main()
{
unsigned int n_int;
unsigned short n_short;
unsigned long n_long;
printf("In This Suite :/n num_int = %d/n num_short = %d/n num_long = %d/n",8*sizeof(n_int),8*sizeof(n_short),8*sizeof(n_long));
return 0;
}
這種方法比較簡便,利用sizeof函數來幫你查出整形變量的大小,但需要注意sizeof函數返回的是字節數,需要乘以8來修正(一個字節佔8位)。
(以上兩個程序只在TC和Linux下運行過,但沒在VC++下運行過。)