#include <stddef.h>
OS version:Red Hat Enterprise Linux Server release 5.3 (Tikanga) Linux 2.6.18-128.el5 #1 SMP Wed Dec 17 11:41:38 EST 2008 x86_64 x86_64 x86_64 GNU/Linux
size_t本身一個(gè)作用就是避免考慮64還是32。64位下Long和指針是64位的
size_tm_unNo;
sprintf(path,"%u",m_unNo); //這句在32位機(jī)器上正常 64位機(jī)器上會(huì)編譯警告:“警告:格式 ‘%u’ 需要類型 ‘unsigned int’,但實(shí)參 4 的類型為 ‘size_t’”
%u 對(duì)應(yīng) unsigned int在64位機(jī)器上還是32位,而size_t已經(jīng)變成64位了。
char* 指針在64位下是64位
m_pMem = new char[nSize];
int off = (int)m_pMem%nAlign; // 在 32位編譯正常,在64位機(jī)器上編譯報(bào)錯(cuò):“ 錯(cuò)誤:從 ‘char*’ 到 ‘int’ 的轉(zhuǎn)換損失精度”
改為就可以達(dá)到兼容效果了int off = (uint64_t)m_pMem%nAlign; // 因?yàn)閕nt在64位下仍為32位,char×已經(jīng)變位64位了。
一、數(shù)據(jù)類型特別是int相關(guān)的類型在不同位數(shù)機(jī)器的平臺(tái)下長(zhǎng)度不同。C99標(biāo)準(zhǔn)并不規(guī)定具體數(shù)據(jù)類型的長(zhǎng)度大小,只規(guī)定級(jí)別。作下比較:
16位平臺(tái)
char 1個(gè)字節(jié)8位
short 2個(gè)字節(jié)16位
int 2個(gè)字節(jié)16位
long 4個(gè)字節(jié)32位
指針 2個(gè)字節(jié)
32位平臺(tái)
char 1個(gè)字節(jié)8位
short 2個(gè)字節(jié)16位
int 4個(gè)字節(jié)32位
long 4個(gè)字節(jié)
long long 8個(gè)字節(jié)
指針 4個(gè)字節(jié)
64位平臺(tái)
char 1個(gè)字節(jié)
short 2個(gè)字節(jié)
int 4個(gè)字節(jié)
long 8個(gè)字節(jié)(區(qū)別)
long long 8個(gè)字節(jié)
指針 8個(gè)字節(jié)(區(qū)別)
二、編程注意事項(xiàng)
為了保證平臺(tái)的通用性,程序中盡量不要使用long數(shù)據(jù)庫(kù)型。可以使用固定大小的數(shù)據(jù)類型宏定義:
typedef signed char int8_t
typedef short int int16_t;
typedef int int32_t;
# if __WORDSIZE == 64
typedef long int int64_t;
# else
__extension__
typedef long long int int64_t;
#endif
三、使用int時(shí)也可以使用intptr_t來(lái)保證平臺(tái)的通用性,它在不同的平臺(tái)上編譯時(shí)長(zhǎng)度不同,但都是標(biāo)準(zhǔn)的平臺(tái)長(zhǎng)度,比如64位機(jī)器它的長(zhǎng)度就是8字節(jié),32位機(jī)器它的長(zhǎng)度是4字節(jié),定義如下:
#if __WORDSIZE == 64
typedef long int intptr_t;
#else
typedef int intptr_t;
#endif
編程中要盡量使用sizeof來(lái)計(jì)算數(shù)據(jù)類型的大小
以上類型定義都有相應(yīng)的無(wú)符號(hào)類型。
另 外還有ssize_t和size_t分別是unsigned和signed size of computer word size。它們也是表示計(jì)算機(jī)的字長(zhǎng),在32位機(jī)器上是int型,在64位機(jī)器上long型,從某種意義上來(lái)說(shuō)它們等同于intptr_t和 uintptr_t。它們?cè)趕tddef.h里面定義。需要注意的是socket的accept函數(shù)在有些操作系統(tǒng)上使用size_t是不正確的,因?yàn)?accept接收的int*類型,而size_t可能是long int 類型。后來(lái)BSD使用sock_t來(lái)替代它。