⑴ 如何驗證int型在gcc編譯器中佔有4位元組,程序如何編寫
直接sizeof(int)就行了
⑵ c++中byte 後面加一個變數名稱什麼意思
一、指針地址的本質和存儲
在C++中所有的指針地址的大小都是固定的,也就都是4個位元組的大小,地址的本質就是一串0和1的機器代碼。任何一個變數都必須佔有一個地址,而這個地址空間內的0-1代碼就是這個變數的值。不同的數據類型佔有的空間大小不一,但是他們都必須有個地址,而這個地址就是硬體訪問的依據,而名字只是提供給程序員的一種記住這個地址的方便一點的方法。但是,不同的變數在機器中都是0-1代碼,所以,我們不能簡單的通過檢查一個值的位來判斷它的類型。
例如,定義如下:
[cpp]view plain
inta;<spanstyle="font-size:14px;">
floatb;
doublec;
longdoubled</span>
(假設它們所佔的位元組分別是4、8、8、10,而且連續存儲於某個地址空間,起始地址是100,則我們可以得到如下內存分布)a變數就是由以地址100開始到103結束的4個位元組內存空間內的0-1代碼組成。b變數則是由以地址104開始到112結束的8個位元組內存空間內的0-1代碼組成。而在機器中,這些內存都是連續的0-1代碼,機器並不知道100~103是整型而104~111是float型,所有這些類型都是編譯器告知的。當我們用a時,由於前面把a定義為int型,則編譯器知道從a的地址開始向後取4個位元組再把它解釋成int型。那麼(float)a,就是先按照int類型取出該數值,再將該數值按照int to float的規則轉換成float型。注意:指針地址只指向數據存儲的內存的位置,具體變數的類型有編譯器告知。
二、指針的轉換
指針占據一個4個位元組的地址空間(由於程序的定址空間是2^32次方,即4GB,所以用4個位元組表示指針就已經能指向任何程序能夠定址到的空間了,所以指針的大小為4位元組),他的值是另一個東西的地址,這個東西可以是普通變數,結構體,還可以是個函數等等。由於,指針的大小是4位元組,所以,我們可以將指針強制轉換成int型或者其他類型。同樣,我們也可以將任何一個常數轉換成int型再賦值給指針。所有的指針所佔的空間大小都是4位元組,他們只是聲明的類型不同,他們的值都是地址指向某個東西,他們對於機器來說沒有本質差別,他們之間可以進行強制類型轉換。
⑶ 怎麼查看c++編譯器是幾位元組對齊
給你個詳細的參考。。看了就應該可也明白了。。太亂的話。。直接看參考資料給的鏈接吧。。C/C++內存對齊一、什麼是位元組對齊,為什麼要對齊? 現代計算機中內存空間都是按照byte劃分的,從理論上講似乎對任何類型的變數的訪問可以從任何地址開始,但實際情況是在訪問特定類型變數的時候經常在特 定的內存地址訪問,這就需要各種類型數據按照一定的規則在空間上排列,而不是順序的一個接一個的排放,這就是對齊。 對齊的作用和原因:各個硬體平台對存儲空間的處理上有很大的不同。一些平台對某些特定類型的數據只能從某些特定地址開始存取。比如有些架構的CPU在訪問 一個沒有進行對齊的變數的時候會發生錯誤,那麼在這種架構下編程必須保證位元組對齊.其他平台可能沒有這種情況,但是最常見的是如果不按照適合其平台要求對 數據存放進行對齊,會在存取效率上帶來損失。比如有些平台每次讀都是從偶地址開始,如果一個int型(假設為32位系統)如果存放在偶地址開始的地方,那 么一個讀周期就可以讀出這32bit,而如果存放在奇地址開始的地方,就需要2個讀周期,並對兩次讀出的結果的高低位元組進行拼湊才能得到該32bit數 據。顯然在讀取效率上下降很多。二、請看下面的結構:struct MyStruct { double dda1; char dda; int type }; 對結構MyStruct採用sizeof會出現什麼結果呢?sizeof(MyStruct)為多少呢?也許你會這樣求: sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13 但是當在VC中測試上面結構的大小時,你會發現sizeof(MyStruct)為16。你知道為什麼在VC中會得出這樣一個結果嗎? 其實,這是VC對變數存儲的一個特殊處理。為了提高CPU的存儲速度,VC對一些變數的起始地址做了「對齊」處理。在默認情況下,VC規定各成員變數存放的起始地址相對於結構的起始地址的偏移量必須為該變數的類型所佔用的位元組數的倍數。下面列出常用類型的對齊方式(vc6.0,32位系統)。 類型 對齊方式(變數存放的起始地址相對於結構的起始地址的偏移量) Char 偏移量必須為sizeof(char)即1的倍數 int 偏移把type
⑷ c/c++ 編譯器如何區分char[] 與 char*
1、本身 char [] 和char * 就是不同的符號 編譯器自然能識別 。
2、你說的是符號表吧。 符號表主要是給鏈接器用的。
3、關鍵你要理解C/C++程序的存儲分布。
一個由c/C++編譯的程序佔用的內存分為以下幾個部分
1、棧區(stack)—由編譯器自動分配釋放,存放函數的參數值,局部變數的值等。其操作方式類似於
數據結構中的棧。
2、堆區(heap)—一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收。注意它與數據
結構中的堆是兩回事,分配方式倒是類似於鏈表,呵呵。
3、全局區(靜態區)(static)—全局變數和靜態變數的存儲是放在一塊的,初始化的全局變數和靜態
變數在一塊區域,未初始化的全局變數和未初始化的靜態變數在相鄰的另一塊區域。程序結束後由系統
釋放。
4、文字常量區—常量字元串就是放在這里的。程序結束後由系統釋放。
5、程序代碼區
這是一個前輩寫的,非常詳細
//main.cpp
int a=0; //全局初始化區
char *p1; //全局未初始化區
main()
{
int b;棧
char s[]="abc"; //棧
char *p2; //棧
char *p3="123456"; //123456\0在常量區,p3在棧上。
static int c=0; //全局(靜態)初始化區
p1 = (char*)malloc(10);
p2 = (char*)malloc(20); //分配得來得10和20位元組的區域就在堆區。
strcpy(p1,"123456"); //123456\0放在常量區,編譯器可能會將它與p3所向"123456"優化成一個地方。
}
stack:
由系統自動分配。例如,聲明在函數中一個局部變數int b;系統自動在棧中為b開辟空間
heap:
需要程序員自己申請,並指明大小,在c中malloc函數
如p1=(char*)malloc(10);
在C++中用new運算符
如p2=(char*)malloc(10);
但是注意p1、p2本身是在棧中的。
⑸ 編譯器定義長整形佔4個位元組,短整型佔2個位元組有什麼用處體現在哪裡
可以容納的大小不同,4個位元組就是可以到2^32 - 1 , 2個位元組就只能到 2^16 - 1
⑹ 編譯器如何識別字元是關鍵字還是變數名的
編譯過程大概分這么幾步
首先用有限狀態自動機把代碼文本分割成一個一個的token,每個token是一個意義單位,
比如
int main(123);
就被分割成了
int
main
(
123
)
然後對token列表根據該語言的語法建立語法樹,在建立語法樹的過程中就要區分某個單詞是關鍵字還是標識符(也就是變數名),一般來講編譯器一般都有一個保留字列表,開始的時候都當作變數名看待,如果發現某個變數名出現在了保留字列表裡,就對其進行標識處理。
⑺ c語言中,VC6.0中int類型變數所佔的位元組數是1嗎在哪裡int類型變數所佔的位元組數是4的呢
VC6.0中基本整型int佔4個位元組,而在以前使用的TC2.0中只佔2個位元組。
⑻ C語言中長整形4個位元組的數據范圍是多少
有些是有差別的,具體要看編譯器
char/signed
char/unsigned
char:
1個位元組;
char*(即指針變數):
2個位元組(16位編譯器)
4個位元組(32位編譯器)
8個位元組(64位編譯器)
short
int:
2個位元組
int/unsigned
int:
2個位元組(16位編譯器)
4個位元組(32/64位編譯器)
long
int:
4個位元組
float:
4個位元組
double:
8個位元組
long/unsigned
long:
4個位元組(16/32位編譯器)
8個位元組(64位編譯器)
long
long:
8個位元組
指針4個位元組(32位編譯器)
⑼ C語言編程題求解
c吧,一個字元佔一個位元組,結構中字元數組佔四個位元組,int型不同的編譯器所佔位元組是不同的,但一般做題都當兩個位元組做的
不知道對不對
⑽ 問一下各位,c語言編譯器是如何處理變數名的呢
編譯器編譯到int a;時就在內存中開辟一個兩位元組的內存空間,並且命名為a