#include <string.h>
#include <stdio.h>
void main()
{
char buf[256];
int *x;
x = (int *) & buf[1];
*x = 68000;
printf("*x = %d\n",*x);
}
在這段程序中,能夠確保256byte的存儲器區域,其中能夠存儲68000的整數值.但是,這樣也會發
生前面所講的地址問題.在上述的情況下,數組buf的存儲區域從4的整數倍開始.在該數組的第二個
位置(即奇數地址單元)中賦予了數據類型爲int的值.在RISC類型的CPU中,數據類型int值不能存儲
在4的整數倍地址中.因此,在將要對變量x賦值68000的時候,CPU不能夠繼續執行這個程序,則出現
Bus error這個信息,然後終止該程序的運行.
但是,在Pentinm(奔騰)系列的CPU中,則不會產生Bus error這個信息.這是因爲採用了Pentinm
系列的80386的流程的RISC類型的CPU,提高了CPU的處理效率,或電路進行了簡單化處理,從8位開始
就使用了重視移植性的體系結構.
在上述中,我看得不是很明白.請高人詳細地解說一下.
其中最不能理解的是:
1. "數組buf的存儲區域從4的整數倍開始" 爲什麼??
2. "在RISC類型的CPU中,數據類型int值不能存儲在4的整數倍地址中" 爲什麼??
3. "x = (int *) & buf[1];" , 這條語句我知道是進行強制轉換,可是char類型的&buf[1]不是
只有8bit嗎?它怎麼可以轉換成具有32bit的x呢?????
4. "x = (int *) & buf[1];" , 這條語句到底是怎麼實現的?或者說我該怎麼去理解它??收起
1 在SPARC等RISC類型的CPU中,int型數據在內存中4字對齊,char buf[256]s雖然是char型,但爲256個(4的倍數),所以編譯器也使其4字對齊,及其內存開始地址必爲4的整數倍,例如0x1000; 2。 該句表述錯誤,實際應爲“在RISC類型的CPU中,數據類型int值只能存儲在4的整數倍地址中” 3 此處強制類型轉換的是指針而非char型變量,指針指向的內存只不過是一些數據,你可以認爲這些數據是任意類型,char、int 、float、double甚至結構 4 假設buf的開始地址爲0x1000,則這句將0x1001~0x1004的內容拷貝給x(x爲int型),如前所述,int型數據地址必須爲4的整數倍,此處0x1001不滿足該條件,故會引起CPU內部總線錯誤