C的整形變量在Turbo C、VC++、Linux下的大小

C語言中,整形變量在不同的編譯環境下,其內存分配的大小是不相同的。ANSI C的標準沒有規定標識符的長度,但各個C編譯系統都有自己的規定。

C裏的整形變量:shortintlong,要求short型不長於int型,long型不短於int型。在TC環境下,shortint型被分配2字節(word),即16位(bit),long型是4字節,即32位。而在其它編譯環境下int可能會被分配4字節,與long型相同。

如下是各個編譯環境下爲三種整形變量所分配的內存空間:

Turbo C2.0int 16short 16long 32

VC++ 6.0  int 32short 16long 32

Linux下:   int 32short 16long 32

爲了驗證自己所用的編譯器爲三種整形分配多大的內存空間,可以在當前編譯環境下,寫一段測試程序來測量它們的實際大小。

/*

查看C中的變量類型(intshortlong等)在Turbo C 裏的大小。(方法一)

*/

#include "stdio.h"

int main()

{

  /*定義三種整形變量,爲intshort的第16位負值1long的第32位負1,其它位爲0*/

  unsigned int n_int=0x8000;                            /*n_intint型變量*/

  unsigned short n_short=0x8000;                            /*n_intshort型變量*/

  unsigned long n_long=0x80000000;                /*n_intlong型變量*/

  unsigned size_int=16,size_short=16,size_long=32;         

/*假設intshort型最小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_int0,說明最高位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中的變量類型(intshortlong等)在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位)。

 

(以上兩個程序只在TCLinux下運行過,但沒在VC++下運行過。)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章