• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            colorful

            zc qq:1337220912

             

            關(guān)于跨平臺(tái)數(shù)據(jù)類型的幾篇博文 有些矛盾

            c++ 中關(guān)于int,unsigned int , short的跨平臺(tái)移植

            int類型比較特殊,具體的字節(jié)數(shù)同機(jī)器字長(zhǎng)和編譯器有關(guān)。如果要保證移植性,盡量用__int16 __int32 __int64吧
            __int16、__int32這種數(shù)據(jù)類型在所有平臺(tái)下都分配相同的字節(jié)。所以在移植上不存在問(wèn)題。
            所謂的不可移植是指:在一個(gè)平臺(tái)上編寫的代碼無(wú)法拿到另一個(gè)平臺(tái)上運(yùn)行時(shí),不能達(dá)到期望的運(yùn)行結(jié)果
            例如:在32為平臺(tái)上(所謂32位平臺(tái)是指通用寄存器的數(shù)據(jù)寬度是32)編寫代碼,int 類型分配4個(gè)字節(jié),而在16位平臺(tái)是則分配2個(gè)字節(jié),那么在16位上編譯出來(lái)的exe,
            其中是為int分配2字節(jié),而在32位平臺(tái)上運(yùn)行時(shí),會(huì)按照4個(gè)字節(jié)來(lái)解析,顯然會(huì)出錯(cuò)誤的!!

            而對(duì)于非int行,目前為止,所有的類型分配的字節(jié)數(shù)都是兼容的,即不同平臺(tái)對(duì)于同一個(gè)類型分配相同的字節(jié)數(shù)!!

            建議:在代碼中盡量避免使用int類型,根據(jù)不同的需要可以用short,long,unsigned int 等代替。

            下面是各個(gè)類型一覽表【轉(zhuǎn)】

            64位指的是cpu通用寄存器的數(shù)據(jù)寬度是64位的。

            數(shù)據(jù)類型名稱字節(jié)數(shù)別名取值范圍
            int*signed,signed int操作系統(tǒng)決定,即與操作系統(tǒng)的"字長(zhǎng)"有關(guān)
            unsigned int*unsigned由操作系統(tǒng)決定,即與操作系統(tǒng)的"字長(zhǎng)"有關(guān)
            __int81char,signed char–128 到 127
            __int162short,short int,signed short int–32,768 到 32,767
            __int324signed,signed int–2,147,483,648 到 2,147,483,647
            __int648無(wú)–9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
            bool1無(wú)false 或 true
            char1signed char–128 到 127
            unsigned char1無(wú)0 到 255
            short2short int,signed short int–32,768 到 32,767
            unsigned short2unsigned short int0 到 65,535
            long4long int,signed long int–2,147,483,648 到 2,147,483,647
            long long8none (but equivalent to __int64)–9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
            unsigned long4unsigned long int0 到 4,294,967,295
            enum*無(wú)由操作系統(tǒng)決定,即與操作系統(tǒng)的"字長(zhǎng)"有關(guān)
            float4無(wú)3.4E +/- 38 (7 digits)
            double8無(wú)1.7E +/- 308 (15 digits)
            long double8無(wú)1.7E +/- 308 (15 digits)
            wchar_t2__wchar_t0 到 65,535
            類型標(biāo)識(shí)符類型說(shuō)明長(zhǎng)度
            (字節(jié))
            范圍備注
            char字符型1-128 ~ 127-27 ~ (27 -1)
            unsigned char無(wú)符字符型10 ~ 2550 ~ (28 -1)
            short int短整型2-32768 ~ 327672-15 ~ (215 - 1)
            unsigned short int無(wú)符短整型20 ~ 655350 ~ (216 - 1)
            int整型4-2147483648 ~ 2147483647-231 ~ (231 - 1)
            unsigned int無(wú)符整型40 ~ 42949672950 ~ (232-1)
            float實(shí)型(單精度)41.18*10-38 ~ 3.40*10387位有效位
            double實(shí)型(雙精度)82.23*10-308 ~ 1.79*1030815位有效位
            long double實(shí)型(長(zhǎng)雙精度)103.37*10-4932 ~ 1.18*10493219位有效位


            發(fā)表于 2011-04-15 14:02 阿π 閱讀(1812) 評(píng)論(4)  編輯 收藏 引用 所屬分類: 其它
             
            評(píng)論
            # re: c++ 中關(guān)于int,unsigned int , short的跨平臺(tái)移植
            C99應(yīng)該用int**_t
            空明流轉(zhuǎn) 評(píng)論于 2011-04-15 16:14  回復(fù)  更多評(píng)論    
            # re: c++ 中關(guān)于int,unsigned int , short的跨平臺(tái)移植
            我也做過(guò)移植.
            影響中16位平臺(tái),多用C來(lái)開來(lái),多是嵌入式開發(fā).
            32、64位在PC、服務(wù)器級(jí)較多,目前16位已很少.
            我個(gè)人認(rèn)為int型相于對(duì)long類型要安全.
            long類型在windows-64下,仍是32字節(jié);
            但在LINUX-64下long和指針是相當(dāng)?shù)模焉?jí)到了64字節(jié),
            如果結(jié)構(gòu)體中使用long,結(jié)果大小有變,windows64下做的資源在linux下64處理,會(huì)有問(wèn)題,
            最常見的資源頭大小就一致.
            如果是大型項(xiàng)目,還是建立自己的一套低層基本數(shù)據(jù)類型封裝方為上策.
            bbxyard 評(píng)論于 2011-04-15 23:33  回復(fù)  更多評(píng)論    
            # re: c++ 中關(guān)于int,unsigned int , short的跨平臺(tái)移植[未登錄](méi)
            lz說(shuō)的不對(duì),應(yīng)該用int8_t, int16_t,int32_t, int64_t, uintXX_t 等等。而以兩個(gè)下劃線開頭的那種類型是微軟自己的東西,是不可以移植的。
            Alex 評(píng)論于 2011-04-16 23:52  回復(fù)  更多評(píng)論    
            # re: c++ 中關(guān)于int,unsigned int , short的跨平臺(tái)移植
            原來(lái)這么復(fù)雜啊,分析的好詳細(xì),頂!
            free keylogger 評(píng)論于 2011-09-08 22:46  回復(fù)  更多評(píng)論    
             

            ============================================================

            C/C++ 32位機(jī)器和64位機(jī)器 差異問(wèn)題總結(jié) 跨平臺(tái) 移植問(wèn)題 語(yǔ)言編程需要注意的64位和32機(jī)器的區(qū)別  

            2011-09-28 22:39:45|  分類: C++ |  標(biāo)簽:c++  64位機(jī)  數(shù)據(jù)類型   |字號(hào) 訂閱

            轉(zhuǎn)載自:http://hi.baidu.com/jrckkyy/blog/item/61d7869b264d64aec8eaf411.html

            #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)替代它。

            posted on 2012-05-15 17:00 多彩人生 閱讀(1611) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 跨平臺(tái)


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            狠狠色丁香久久婷婷综合图片| 少妇内射兰兰久久| 色综合色天天久久婷婷基地| 狠狠综合久久综合中文88| 女同久久| 91视频国产91久久久| 久久久久久av无码免费看大片| 亚洲中文字幕无码久久2017| 久久国产亚洲精品麻豆| 亚洲国产日韩欧美综合久久| 久久国产一区二区| 精品人妻伦九区久久AAA片69| 久久美女网站免费| 99久久国产精品免费一区二区| 狠狠人妻久久久久久综合| 亚洲伊人久久精品影院| 久久综合亚洲色HEZYO国产| 久久99精品国产自在现线小黄鸭| 四虎国产精品免费久久| 日本久久久久久中文字幕| 俺来也俺去啦久久综合网| 久久久久高潮综合影院| 亚洲v国产v天堂a无码久久| AAA级久久久精品无码区| 精品国产一区二区三区久久| 无码久久精品国产亚洲Av影片| 午夜精品久久影院蜜桃| 久久精品免费网站网| 精品无码久久久久久久久久| 久久精品国产秦先生| 9久久9久久精品| 久久99国产亚洲高清观看首页| 99久久精品免费看国产一区二区三区 | 无码国内精品久久人妻蜜桃| 日韩人妻无码一区二区三区久久99| 国产精自产拍久久久久久蜜| 999久久久国产精品| 久久精品中文字幕一区| 亚洲精品午夜国产va久久| 99久久做夜夜爱天天做精品| 99久久国产综合精品女同图片|