版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、網(wǎng)管產(chǎn)品研發(fā)部門(mén)隨著 64 位體系結(jié)構(gòu)的普及,針對(duì) 64 位系統(tǒng)準(zhǔn)備好您的 Linux® 軟件已經(jīng)變得比以前更為重要。在本文中,您將學(xué)習(xí)如何在進(jìn)行語(yǔ)句聲明、賦值、位移、類(lèi)型轉(zhuǎn)換、字符串格式化以及更多操作時(shí),防止出現(xiàn)可移植性缺陷。Linux 是可以使用 64 位處理器的跨平臺(tái)操作系統(tǒng)之一,現(xiàn)在 64 位的系統(tǒng)在服務(wù)器和桌面端都已經(jīng)非常常見(jiàn)了。很多開(kāi)發(fā)人員現(xiàn)在都面臨著需要將自己的應(yīng)用程序從 32 位環(huán)境移植到 64 位環(huán)境中。隨著 Intel® Itanium® 和其他 64 位處理器的引入,使軟件針對(duì) 64 位環(huán)境做好準(zhǔn)備變得日益重要了。與 UNIX® 和
2、其他類(lèi) UNIX 操作系統(tǒng)一樣,Linux 使用了 LP64 標(biāo)準(zhǔn),其中指針和長(zhǎng)整數(shù)都是 64 位的,而普通的整數(shù)則依然是 32 位的。盡管有些高級(jí)語(yǔ)言并不會(huì)受到這種類(lèi)型大小不同的影響,但是另外一些語(yǔ)言(例如 C 語(yǔ)言)卻的確會(huì)受到這種影響。將應(yīng)用程序從 32 位系統(tǒng)移植到 64 位系統(tǒng)上的工作可能會(huì)非常簡(jiǎn)單,也可能會(huì)非常困難,這取決于這些應(yīng)用程序是如何編寫(xiě)和維護(hù)的。很多瑣碎的問(wèn)題都可能導(dǎo)致產(chǎn)生問(wèn)題,即使在一個(gè)編寫(xiě)得非常好的高度可移植的應(yīng)用程序中也是如此,因此本文將對(duì)這些問(wèn)題進(jìn)行歸納總結(jié),并給出解決這些問(wèn)題的一些方法建議。64 位的優(yōu)點(diǎn)32 位平臺(tái)有很多限制,這些限制正在阻礙大型應(yīng)用程序(例如
3、數(shù)據(jù)庫(kù))開(kāi)發(fā)人員的工作進(jìn)展,尤其對(duì)那些希望充分利用計(jì)算機(jī)硬件優(yōu)點(diǎn)的開(kāi)發(fā)人員來(lái)說(shuō)更是如此??茖W(xué)計(jì)算通常要依賴(lài)于浮點(diǎn)計(jì)算,而有些應(yīng)用程序(例如金融計(jì)算)則需要一個(gè)比較狹窄的數(shù)字范圍,但是卻要求更高的精度,其精度高于浮點(diǎn)數(shù)所提供的精度。64 位數(shù)學(xué)運(yùn)算提供了這種更高精度的定點(diǎn)數(shù)學(xué)計(jì)算,同時(shí)還提供了足夠的數(shù)字范圍?,F(xiàn)在在計(jì)算機(jī)業(yè)界中有很多關(guān)于32位地址空間所表示的地址空間的討論。32 位指針只能尋址 4GB 的虛擬地址空間。我們可以克服這種限制,但是應(yīng)用程序開(kāi)發(fā)就變得非常復(fù)雜了,其性能也會(huì)顯著降低。在語(yǔ)言實(shí)現(xiàn)方面,目前的 C 語(yǔ)言標(biāo)準(zhǔn)要求 “l(fā)ong long” 數(shù)據(jù)類(lèi)型至少是 64 位的。然而,其實(shí)
4、現(xiàn)可能會(huì)將其定義為更大。另外一個(gè)需要改進(jìn)的地方是日期。在 Linux 中,日期是使用 32 位整數(shù)來(lái)表示的,該值所表示的是從 1970 年 1 月 1 日至今所經(jīng)過(guò)的秒數(shù)。這在 2038 年就會(huì)失效。但是在 64 位的系統(tǒng)中,日期是使用有符號(hào)的 64 位整數(shù)表示的,這可以極大地?cái)U(kuò)充其可用范圍??傊?4 位具有以下優(yōu)點(diǎn):· 64 位的應(yīng)用程序可以直接訪問(wèn) 4EB 的虛擬內(nèi)存,Intel Itanium 處理器提供了連續(xù)的線性地址空間。· 64 位的 Linux 允許文件大小最大達(dá)到 4 EB(2 的 63 次冪),其重要的優(yōu)點(diǎn)之一就是可以處理對(duì)大型數(shù)據(jù)庫(kù)的訪問(wèn)。Linux
5、64 位體系結(jié)構(gòu)不幸的是,C 編程語(yǔ)言并沒(méi)有提供一種機(jī)制來(lái)添加新的基本數(shù)據(jù)類(lèi)型。因此,提供 64 位的尋址和整數(shù)運(yùn)算能力必須要修改現(xiàn)有數(shù)據(jù)類(lèi)型的綁定或映射,或者向 C 語(yǔ)言中添加新的數(shù)據(jù)類(lèi)型。表 1. 32 位和 64 位數(shù)據(jù)模型 ILP32LP64LLP64ILP64char8888short16161616int32323264long32643264long long64646464指針32646464這 3 個(gè) 64 位模型(LP64、LLP64 和 ILP64)之間的區(qū)別在于非浮點(diǎn)數(shù)據(jù)類(lèi)型。當(dāng)一個(gè)或多個(gè) C 數(shù)據(jù)類(lèi)型的寬度從一種模型變換成另外一種模型時(shí),應(yīng)用程序
6、可能會(huì)受到很多方面的影響。這些影響主要可以分為兩類(lèi):· 數(shù)據(jù)對(duì)象的大小 。編譯器按照自然邊界對(duì)數(shù)據(jù)類(lèi)型進(jìn)行對(duì)齊;換而言之,32 位的數(shù)據(jù)類(lèi)型在 64 位系統(tǒng)上要按照 32 位邊界進(jìn)行對(duì)齊,而 64 位的數(shù)據(jù)類(lèi)型在 64 位系統(tǒng)上則要按照 64 位邊界進(jìn)行對(duì)齊。這意味著諸如結(jié)構(gòu)或聯(lián)合之類(lèi)的數(shù)據(jù)對(duì)象的大小在 32 位和 64 位系統(tǒng)上是不同的。· 基本數(shù)據(jù)類(lèi)型的大小 。 通常關(guān)于基本數(shù)據(jù)類(lèi)型之間關(guān)系的假設(shè)在 64 位數(shù)據(jù)模型上都已經(jīng)無(wú)效了。依賴(lài)于這些關(guān)系的應(yīng)用程序在 64 位平臺(tái)上編譯也會(huì)失敗。例如,sizeof (int) = sizeof (l
7、ong) = sizeof (pointer) 的假設(shè)對(duì)于 ILP32 數(shù)據(jù)模型有效,但是對(duì)于其他數(shù)據(jù)模型就無(wú)效了。總之,編譯器要按照自然邊界對(duì)數(shù)據(jù)類(lèi)型進(jìn)行對(duì)齊,這意味著編譯器會(huì)進(jìn)行 “填充”,從而強(qiáng)制進(jìn)行這種方式的對(duì)齊,就像是在 C 結(jié)構(gòu)和聯(lián)合中所做的一樣。結(jié)構(gòu)或聯(lián)合的成員是根據(jù)最寬的成員進(jìn)行對(duì)齊的。 清單 1 對(duì)這個(gè)結(jié)構(gòu)進(jìn)行了解釋。清單 1. C 結(jié)構(gòu) struct test int i1;double d;int i2;long l;表 2 給出了這個(gè)結(jié)構(gòu)中每個(gè)成員的大小,以及這個(gè)結(jié)構(gòu)在 32 位系統(tǒng)和 64 位系統(tǒng)上的大小。表 2. 結(jié)構(gòu)和結(jié)構(gòu)成員的大小&
8、#160;結(jié)構(gòu)成員在 32 位系統(tǒng)上的大小在 64 位系統(tǒng)上的大小struct test int i1;32 位32 位 32 位填充double d;64 位64 位int i2;32 位32 位 32 位填充long l;32 位64 位;結(jié)構(gòu)大小為 20 字節(jié)結(jié)構(gòu)大小為 32 字節(jié)注意,在一個(gè) 32 位的系統(tǒng)上,編譯器可能并沒(méi)有對(duì)變量 d 進(jìn)行對(duì)齊,盡管它是一個(gè) 64 位的對(duì)象,這是因?yàn)橛布?huì)將其當(dāng)作兩個(gè) 32 位的對(duì)象進(jìn)行處理。然而,64 位的系統(tǒng)會(huì)對(duì) d 和 l 都進(jìn)行對(duì)齊,這樣會(huì)
9、添加兩個(gè) 4 字節(jié)的填充。從 32 位系統(tǒng)移植到 64 位系統(tǒng)本節(jié)介紹如何解決一些常見(jiàn)的問(wèn)題:· 聲明· 表達(dá)式· 賦值· 數(shù)字常數(shù)· Endianism· 類(lèi)型定義· 位移· 字符串格式化· 函數(shù)參數(shù)聲明要想讓您的代碼在 32 位和 64 位系統(tǒng)上都可以工作,請(qǐng)注意以下有關(guān)聲明的用法:· 根據(jù)需要適當(dāng)?shù)厥褂?“L” 或 “U” 來(lái)聲明整型常量。· 確保使用無(wú)符號(hào)整數(shù)來(lái)防止符號(hào)擴(kuò)展的問(wèn)題 。· 如果有些變量在這兩個(gè)平臺(tái)上都需要是 32 位的,請(qǐng)將其類(lèi)型定義為 int
10、。· 如果有些變量在 32 位系統(tǒng)上是 32 位的,在 64 位系統(tǒng)上是 64 位的,請(qǐng)將其類(lèi)型定義為 long。· 為了對(duì)齊和性能的需要,請(qǐng)將數(shù)字變量聲明為 int 或 long 類(lèi)型。不要試圖使用 char 或 short 類(lèi)型來(lái)保存字節(jié)。· 將字符指針和字符字節(jié)聲明為無(wú)符號(hào)類(lèi)型的,這樣可以防止 8 位字符的符號(hào)擴(kuò)展問(wèn)題。表達(dá)式在 C/C+ 中,表達(dá)式是基于結(jié)合律、操作符的優(yōu)先級(jí)和一組數(shù)學(xué)計(jì)算規(guī)則的。要想讓表達(dá)式在 32 位和 64 位系統(tǒng)上都可以正確工作,請(qǐng)注意以下規(guī)則:· 兩個(gè)有符號(hào)整數(shù)相加的結(jié)果是一個(gè)有符號(hào)整數(shù)。· int 和 lon
11、g 類(lèi)型的兩個(gè)數(shù)相加,結(jié)果是一個(gè) long 類(lèi)型的數(shù)。· 如果一個(gè)操作數(shù)是無(wú)符號(hào)整數(shù),另外一個(gè)操作數(shù)是有符號(hào)整數(shù),那么表達(dá)式的結(jié)果就是無(wú)符號(hào)整數(shù)。· int 和 doubule 類(lèi)型的兩個(gè)數(shù)相加,結(jié)果是一個(gè) double 類(lèi)型的數(shù)。此處 int 類(lèi)型的數(shù)在執(zhí)行加法運(yùn)算之前轉(zhuǎn)換成 double 類(lèi)型。賦值由于指針、int 和 long 在 64 位系統(tǒng)上大小不再相同了,因此根據(jù)這些變量是如何賦值和在應(yīng)用程序中使用的,可能會(huì)出現(xiàn)問(wèn)題。下面是有關(guān)賦值的一些技巧:· 不要交換使用 int 和 long 類(lèi)型,因?yàn)檫@可能會(huì)導(dǎo)致高位數(shù)字被截?cái)?。例如,不要做下面的事情:int
12、i;long l;i = l;· 不要使用 int 類(lèi)型來(lái)存儲(chǔ)指針。下面這個(gè)例子在 32 位系統(tǒng)上可以很好地工作,但是在 64 位系統(tǒng)上會(huì)失敗,這是因?yàn)?32 位整數(shù)無(wú)法存放 64 位的指針。例如,不要做下面的事情:unsigned int i, *ptr;i = (unsigned) ptr;· 不要使用指針來(lái)存放 int 類(lèi)型的值。例如,不要做下面的事情;int *ptr;int i;ptr = (int *) i;· 如果在表達(dá)式中混合使用無(wú)符號(hào)和有符號(hào)的 32 位整數(shù),并將其賦值給一個(gè)有符號(hào)的 long 類(lèi)型,那么將其中一個(gè)操作數(shù)轉(zhuǎn)換成 64 位的類(lèi)型。這
13、會(huì)導(dǎo)致其他操作數(shù)也被轉(zhuǎn)換成 64 位的類(lèi)型,這樣在對(duì)表達(dá)式進(jìn)行賦值時(shí)就不需要再進(jìn)行轉(zhuǎn)換了。另外一種解決方案是對(duì)整個(gè)表達(dá)式進(jìn)行轉(zhuǎn)換,這樣就可以在賦值時(shí)進(jìn)行符號(hào)擴(kuò)展。例如,考慮下面這 種用法可能會(huì)出現(xiàn)的問(wèn)題:long n;int i = -2;unsigned k = 1;n = i + k;從數(shù)學(xué)計(jì)算上來(lái)說(shuō),上面這個(gè)黑體顯示的表達(dá)式的結(jié)果應(yīng)該是 -1 。但是由于表達(dá)式是無(wú)符號(hào)的,因此不會(huì)進(jìn)行符號(hào)擴(kuò)展。解決方案是將一個(gè)操作數(shù)轉(zhuǎn)換成 64 位類(lèi)型(下面的第一行就是這樣),或者對(duì)整個(gè)表達(dá)式進(jìn)行轉(zhuǎn)換(下面第二行):n = (long) i + k;n = (int) (i + k);數(shù)字常量16 進(jìn)制的
14、常量通常都用作掩碼或特殊位的值。如果一個(gè)沒(méi)有后綴的 16 進(jìn)制的常量是 32 位的,并且其高位被置位了,那么它就可以作為無(wú)符號(hào)整型進(jìn)行定義。例如,常數(shù) OxFFFFFFFFL 是一個(gè)有符號(hào)的 long 類(lèi)型。在 32 位系統(tǒng)上,這會(huì)將所有位都置位(每位全為 1),但是在 64 位系統(tǒng)上,只有低 32 位被置位了,結(jié)果是這個(gè)值是 0x00000000FFFFFFFF。如果我們希望所有位全部置位,那么一種可移植的方法是定義一個(gè)有符號(hào)的常數(shù),其值為 -1。這會(huì)將所有位全部置位,因?yàn)樗捎昧硕M(jìn)制補(bǔ)碼算法。long x = -1L;可能產(chǎn)生的另外一個(gè)問(wèn)題是最高位的設(shè)置。在 32 位系統(tǒng)上,我們使用的是
15、常量 0x80000000。但是可移植性更好的方法是使用一個(gè)位移表達(dá)式:1L << (sizeof(long) * 8) - 1);EndianismEndianism 是指用來(lái)存儲(chǔ)數(shù)據(jù)的方法,它定義了整數(shù)和浮點(diǎn)數(shù)據(jù)類(lèi)型中是如何對(duì)字節(jié)進(jìn)行尋址的。Little-endian 是將低位字節(jié)存儲(chǔ)在內(nèi)存的低地址中,將高位字節(jié)存儲(chǔ)在內(nèi)存的高地址中。Big-endian 是將高位字節(jié)存儲(chǔ)在內(nèi)存的低地址中,將低位字節(jié)存儲(chǔ)在內(nèi)存的高地址中。表 3 給出了一個(gè) 64 位長(zhǎng)整數(shù)的布局示例。表 3. 64 位 long int 類(lèi)型的布局 低地址
16、 高地址Little endianByte 0Byte 1Byte 2Byte 3Byte 4Byte 5Byte 6Byte 7Big endianByte 7Byte 6Byte 5Byte 4Byte 3Byte 2Byte 1Byte 0例如,32 位的字 0x12345678 在 big endian 機(jī)器上的布局如下:表 4. 0x12345678 在 big-endian 系統(tǒng)上的布局 內(nèi)存偏移量0123內(nèi)存內(nèi)容0x120x340x560x78如果將 0x12345678 當(dāng)作兩個(gè)半字來(lái)看待,分別是 0x1234 和 0x5678,那么
17、就會(huì)看到在 big endian 機(jī)器上是下面的情況:表 5. 0x12345678 在 big-endian 系統(tǒng)上當(dāng)作兩個(gè)半字來(lái)看待的情況 內(nèi)存偏移量02內(nèi)存內(nèi)容0x12340x5678然而,在 little endian 機(jī)器上,字 0x12345678 的布局如下所示:表 6. 0x12345678 在 little-endian 系統(tǒng)上的布局 內(nèi)存偏移量0123內(nèi)存內(nèi)容0x780x560x340x12類(lèi)似地,兩個(gè)半字 0x1234 和 0x5678 如下所示:表 7. 0x12345678 在 little-endian 系統(tǒng)上作為兩個(gè)半字看到的情況 內(nèi)
18、存偏移量02內(nèi)存內(nèi)容0x34120x7856下面這個(gè)例子解釋了 big endian 和 little endian 機(jī)器上字節(jié)順序之間的區(qū)別。下面的 C 程序在一臺(tái) big endian 機(jī)器上進(jìn)行編譯和運(yùn)行時(shí)會(huì)打印 “Big endian”,在一臺(tái) little endian 機(jī)器上進(jìn)行編譯和運(yùn)行時(shí)會(huì)打印 “Little endian”。清單 2. big endian 與 little endian #include <stdio.h>main () int i = 0x12345678;if (*(char *)&i = 0x12)printf (&quo
19、t;Big endian/n");else if (*(char *)&i = 0x78) printf ("Little endian/n");Endianism 在以下情況中非常重要:· 使用位掩碼時(shí)· 對(duì)象的間接指針地址部分在 C 和 C+ 中有位域來(lái)幫助處理 endian 的問(wèn)題。我建議使用位域,而不要使用掩碼域或 16 進(jìn)制的常量。有幾個(gè)函數(shù)可以用來(lái)將 16 位和 32 位數(shù)據(jù)從 “主機(jī)字節(jié)順序” 轉(zhuǎn)換成 “網(wǎng)絡(luò)字節(jié)順序”。例如,htonl (3) 、ntohl (3) 用來(lái)轉(zhuǎn)換 32 位整數(shù)。類(lèi)似地,ht
20、ons (3) 、ntohs (3) 用來(lái)轉(zhuǎn)換 16 位整數(shù)。然而,對(duì)于 64 位整數(shù)來(lái)說(shuō),并沒(méi)有標(biāo)準(zhǔn)的函數(shù)集。但是在 big endian 和 little endian 系統(tǒng)上,Linux 都提供了下面的幾個(gè)宏:· bswap_16· bswap_32· bswap_64類(lèi)型定義建議您不要使用 C/C+ 中那些在 64 位系統(tǒng)上會(huì)改變大小的數(shù)據(jù)類(lèi)型來(lái)編寫(xiě)應(yīng)用程序,而是使用一些類(lèi)型定義或宏來(lái)顯式地說(shuō)明變量中所包含的數(shù)據(jù)的大小和類(lèi)型。有些定義可以使代碼的可移植性更好。· ptrdiff_t : 這是一個(gè)有符號(hào)整型,
21、是兩個(gè)指針相減后的結(jié)果。· size_t : 這是一個(gè)無(wú)符號(hào)整型,是執(zhí)行 sizeof 操作的結(jié)果。這在向一些函數(shù)(例如 malloc (3) )傳遞參數(shù)時(shí)使用,也可以從一些函數(shù)(比如 fred (2) )中返回。· int32_t 、uint32_t 等: 定義具有預(yù)定義寬度的整型。· intptr_t 和 uintptr_t : 定義整型類(lèi)型,任何有效指針都可以轉(zhuǎn)換成這個(gè)類(lèi)型。例 1:在下面這條語(yǔ)句中,在對(duì)
22、60;bufferSize 進(jìn)行賦值時(shí),從 sizeof 返回的 64 位值被截?cái)喑闪?32 位。int bufferSize = (int) sizeof (something);解決方案是使用 size_t 對(duì)返回值進(jìn)行類(lèi)型轉(zhuǎn)換,并將其賦給聲明為 size_t 類(lèi)型的 bufferSize,如下所示:size_t bufferSize = (size_t) sizeof (something);例 2:在 32 位系統(tǒng)上,int 和 long 大小相同。由于這一點(diǎn),有些開(kāi)發(fā)人員會(huì)交換使用這兩種類(lèi)型。這可能會(huì)導(dǎo)致指針被賦值
23、給 int 類(lèi)型,或者反之。但是在 64 位的系統(tǒng)上,將指針賦值給 int 類(lèi)型會(huì)導(dǎo)致截?cái)喔?32 位的值。解決方案是將指針作為指針類(lèi)型或?yàn)榇硕x的特殊類(lèi)型進(jìn)行存儲(chǔ),例如 intptr_t 和 uintptr_t。位移無(wú)類(lèi)型的整數(shù)常量就是 (unsigned) int 類(lèi)型的。這可能會(huì)導(dǎo)致在位移時(shí)出現(xiàn)被截?cái)嗟膯?wèn)題。例如,在下面的代碼中,a 的最大值可以是 31。這是因?yàn)?#160;1 << a 是 int 類(lèi)型的。long t = 1 << a;要在 64 位系統(tǒng)上進(jìn)行位移,應(yīng)該使用 1L ,如下所
24、示:long t = 1L << a;字符串格式化函數(shù) printf (3) 及其相關(guān)函數(shù)都可能成為問(wèn)題的根源。 例如,在 32 位系統(tǒng)上,使用 %d 來(lái)打印 int 或 long 類(lèi)型的值都可以,但是在 64 位平臺(tái)上,這會(huì)導(dǎo)致將 long 類(lèi)型的值截?cái)喑傻?32 位的值。對(duì)于 long 類(lèi)型的變量來(lái)說(shuō),正確的用法是 %ld 。類(lèi)似地,當(dāng)一個(gè)小整數(shù)(char、short、int)被傳遞給 printf (3) 時(shí),它會(huì)擴(kuò)展成 64 位的,符號(hào)會(huì)適當(dāng)?shù)剡M(jìn)行擴(kuò)展。在下面的例子中,printf (
25、3) 假設(shè)指針是 32 位的。char *ptr = &something;printf (%x/n", ptr);上面的代碼在 64 位系統(tǒng)上會(huì)失敗,它只會(huì)顯示低 4 字節(jié)的內(nèi)容。這個(gè)問(wèn)題的解決方案是使用 %p ,如下所示;這在 32 位和 64 位系統(tǒng)上都可以很好地工作:char *ptr = &something;printf (%p/n", ptr);函數(shù)參數(shù)在向函數(shù)傳遞參數(shù)時(shí)需要記住幾件事情:· 在參數(shù)的數(shù)據(jù)類(lèi)型是由函數(shù)原型定義的情況中,參數(shù)應(yīng)該根據(jù)標(biāo)準(zhǔn)規(guī)則轉(zhuǎn)換成這種類(lèi)型。· 在參數(shù)類(lèi)型沒(méi)有指定的情
26、況中,參數(shù)會(huì)被轉(zhuǎn)換成更大的類(lèi)型。· 在 64 位系統(tǒng)上,整型被轉(zhuǎn)換成 64 位的整型值,單精度的浮點(diǎn)類(lèi)型被轉(zhuǎn)換成雙精度的浮點(diǎn)類(lèi)型。· 如果返回值沒(méi)有指定,那么函數(shù)的缺省返回值是 int 類(lèi)型的。在將有符號(hào)整型和無(wú)符號(hào)整型的和作為 long 類(lèi)型傳遞時(shí)就會(huì)出現(xiàn)問(wèn)題??紤]下面的情況:清單 3. 將有符號(hào)整型和無(wú)符號(hào)整型的和作為 long 類(lèi)型傳遞 long function (long l);int main () int i = -2;unsigned k = 1U;long n = function (i + k);上面這段代碼在 64 位系統(tǒng)上會(huì)失敗,因?yàn)楸磉_(dá)式
27、 (i + k) 是一個(gè)無(wú)符號(hào)的 32 位表達(dá)式,在將其轉(zhuǎn)換成 long 類(lèi)型時(shí),符號(hào)并沒(méi)有得到擴(kuò)展。解決方案是將一個(gè)操作數(shù)強(qiáng)制轉(zhuǎn)換成 64 位的類(lèi)型。在基于寄存器的系統(tǒng)上還有一個(gè)問(wèn)題:系統(tǒng)采用寄存器而不是堆棧來(lái)向函數(shù)傳遞參數(shù)??紤]下面的例子:float f = 1.25;printf ("The hex value of %f is %x", f, f);在基于堆棧的系統(tǒng)中,這會(huì)打印對(duì)應(yīng)的 16 進(jìn)制值。但是在基于寄存器的系統(tǒng)中,這個(gè) 16 進(jìn)制的值會(huì)從一個(gè)整數(shù)寄存器中讀取,而不是從浮點(diǎn)寄存器中讀取。解決方案是將浮點(diǎn)變量的地址強(qiáng)制轉(zhuǎn)換成一個(gè)指向整型類(lèi)型
28、的指針,如下所示:printf ("The hex value of %f is %x", f, *(int *)&f);結(jié)束語(yǔ)主 流的硬件供應(yīng)商最近都在擴(kuò)充自己的 64 位產(chǎn)品,這是因?yàn)?64 位平臺(tái)可以提供更好的性能、價(jià)值和可伸縮性。32 位系統(tǒng)的限制,特別是 4GB 的虛擬內(nèi)存上限,已經(jīng)極大地刺激很多公司開(kāi)始考慮遷移到 64 位平臺(tái)上。了解如何將應(yīng)用程序移植到 64 位體系結(jié)構(gòu)上可以幫助我們編寫(xiě)可移植性更好且效率更高的代碼。 參考資料學(xué)習(xí) · 您可以參閱本文在 developerWorks 全球站點(diǎn)上的 英文原文
29、0;。· 64-Bit Programming Models: Why LP64? 介紹了有關(guān)各種 64 位編程模型的更多細(xì)節(jié)知識(shí)和有關(guān) LP64 的爭(zhēng)論。 · 請(qǐng)?jiān)?Wikipedia 上了解 32 位系統(tǒng)所具有的 2038 年問(wèn)題 。 · 請(qǐng)閱讀 “將企業(yè)應(yīng)用程序從 UNIX 移植到 Linux ”(developerWorks,2005 年 2 月),了解有關(guān)將大型多線程應(yīng)用程序移植到 Linux 上的技巧和內(nèi)幕。 · “Porting Intel applications to
30、 64 bit Linux PowerPC ” 討論了在將 Linux 從 IA32 移植到 PowerPC 上時(shí)所要考慮的一些問(wèn)題。 · Linux Online() Linux distributions site 提供了有關(guān)發(fā)行版的豐富信息,包括 64 位系統(tǒng)上的發(fā)行版。 · developerWorks Linux on Power Architecture developer's corner 是為在基于 POWER 硬件的 Linux 上運(yùn)行的應(yīng)用程序的程序員和開(kāi)發(fā)人
31、員準(zhǔn)備的參考資料。 · 是專(zhuān)為 PowerPC 系統(tǒng)上的 Linux 用戶(hù)準(zhǔn)備的一個(gè)社區(qū)站點(diǎn)。 · 在 developerWorks Linux 專(zhuān)區(qū) 中可以找到為 Linux 開(kāi)發(fā)人員準(zhǔn)備的更多參考資料。 · 隨時(shí)關(guān)注 developerWorks 技術(shù)事件和網(wǎng)絡(luò)廣播 。小bug引起的C程序32位-64位移植問(wèn)題在64位平臺(tái)上測(cè)試原來(lái)在32位平臺(tái)上工作正常的一個(gè)Linux C工程,訪問(wèn)某個(gè)函數(shù)的返回值時(shí)總是出現(xiàn)Segmentation fault。經(jīng)查,是缺少一個(gè)extern聲明引起的:在A.c中調(diào)用了B.c定義的函數(shù)f(),該函數(shù)返回類(lèi)型是char *。在A.c中遺漏了對(duì)該函數(shù)的exte
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 節(jié)能減排法律宣傳資助合同
- 車(chē)輛服務(wù)合同的修改
- 定制商品采購(gòu)合同
- 電力分包合同的法律風(fēng)險(xiǎn)與防范
- 養(yǎng)老機(jī)構(gòu)服務(wù)合同問(wèn)答
- 個(gè)人購(gòu)車(chē)貸款資金額度借款合同
- 農(nóng)村養(yǎng)牛合作合同樣本
- 坯布訂購(gòu)合同送貨詳情
- 中介服務(wù)合同中的合同修改與補(bǔ)充
- 公司擔(dān)保保證金協(xié)議
- 醫(yī)院能源管理平臺(tái)建設(shè)方案合集
- 海南洪水影響區(qū)域評(píng)估報(bào)告
- 《北京大學(xué)介紹》課件
- 校園蛋糕創(chuàng)業(yè)計(jì)劃書(shū)
- 麻醉科臨床診療指南2020版
- 2024年廣西北部灣港集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 課程設(shè)計(jì)電動(dòng)葫蘆設(shè)計(jì)
- 對(duì)高職院校學(xué)分銀行建設(shè)的思考
- 三查四定表完整版本
- VDA6.5產(chǎn)品審核報(bào)告
- 項(xiàng)目部管理人員通訊錄
評(píng)論
0/150
提交評(píng)論