• <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

             

            關于跨平臺數據類型的幾篇博文 有些矛盾

            c++ 中關于int,unsigned int , short的跨平臺移植

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

            而對于非int行,目前為止,所有的類型分配的字節數都是兼容的,即不同平臺對于同一個類型分配相同的字節數!!

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

            下面是各個類型一覽表【轉】

            64位指的是cpu通用寄存器的數據寬度是64位的。

            數據類型名稱字節數別名取值范圍
            int*signed,signed int操作系統決定,即與操作系統的"字長"有關
            unsigned int*unsigned由操作系統決定,即與操作系統的"字長"有關
            __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–9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
            bool1false 或 true
            char1signed char–128 到 127
            unsigned char10 到 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*由操作系統決定,即與操作系統的"字長"有關
            float43.4E +/- 38 (7 digits)
            double81.7E +/- 308 (15 digits)
            long double81.7E +/- 308 (15 digits)
            wchar_t2__wchar_t0 到 65,535
            類型標識符類型說明長度
            (字節)
            范圍備注
            char字符型1-128 ~ 127-27 ~ (27 -1)
            unsigned char無符字符型10 ~ 2550 ~ (28 -1)
            short int短整型2-32768 ~ 327672-15 ~ (215 - 1)
            unsigned short int無符短整型20 ~ 655350 ~ (216 - 1)
            int整型4-2147483648 ~ 2147483647-231 ~ (231 - 1)
            unsigned int無符整型40 ~ 42949672950 ~ (232-1)
            float實型(單精度)41.18*10-38 ~ 3.40*10387位有效位
            double實型(雙精度)82.23*10-308 ~ 1.79*1030815位有效位
            long double實型(長雙精度)103.37*10-4932 ~ 1.18*10493219位有效位


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

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

            C/C++ 32位機器和64位機器 差異問題總結 跨平臺 移植問題 語言編程需要注意的64位和32機器的區別  

            2011-09-28 22:39:45|  分類: C++ |  標簽:c++  64位機  數據類型   |字號 訂閱

            轉載自: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本身一個作用就是避免考慮64還是32。64位下Long和指針是64位的

            size_tm_unNo;

            sprintf(path,"%u",m_unNo); //這句在32位機器上正常 64位機器上會編譯警告:“警告:格式 ‘%u’ 需要類型 ‘unsigned int’,但實參 4 的類型為 ‘size_t’”

            %u 對應 unsigned int在64位機器上還是32位,而size_t已經變成64位了。

            char* 指針在64位下是64位

            m_pMem = new char[nSize];
            int off = (int)m_pMem%nAlign; // 在 32位編譯正常,在64位機器上編譯報錯:“ 錯誤:從 ‘char*’ 到 ‘int’ 的轉換損失精度”

            改為就可以達到兼容效果了int off = (uint64_t)m_pMem%nAlign; // 因為int在64位下仍為32位,char×已經變位64位了。

             

             

             

             

            一、數據類型特別是int相關的類型在不同位數機器的平臺下長度不同。C99標準并不規定具體數據類型的長度大小,只規定級別。作下比較:

            16位平臺

            char         1個字節8位

            short        2個字節16位

            int            2個字節16位

            long         4個字節32位

            指針         2個字節

            32位平臺

            char         1個字節8位

            short        2個字節16位

            int            4個字節32位

            long         4個字節

            long long 8個字節

            指針         4個字節

            64位平臺

            char         1個字節

            short        2個字節

            int            4個字節

            long         8個字節(區別)

            long long 8個字節

            指針        8個字節(區別)

            二、編程注意事項

            為了保證平臺的通用性,程序中盡量不要使用long數據庫型。可以使用固定大小的數據類型宏定義:

            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時也可以使用intptr_t來保證平臺的通用性,它在不同的平臺上編譯時長度不同,但都是標準的平臺長度,比如64位機器它的長度就是8字節,32位機器它的長度是4字節,定義如下:

            #if __WORDSIZE == 64
            typedef long int                intptr_t;
            #else
            typedef int                        intptr_t;
            #endif
            編程中要盡量使用sizeof來計算數據類型的大小

            以上類型定義都有相應的無符號類型。

            另 外還有ssize_t和size_t分別是unsigned和signed size of computer word size。它們也是表示計算機的字長,在32位機器上是int型,在64位機器上long型,從某種意義上來說它們等同于intptr_t和 uintptr_t。它們在stddef.h里面定義。需要注意的是socket的accept函數在有些操作系統上使用size_t是不正確的,因為 accept接收的int*類型,而size_t可能是long int 類型。后來BSD使用sock_t來替代它。

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

            導航

            統計

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            97久久精品无码一区二区 | 区久久AAA片69亚洲| 18禁黄久久久AAA片| 一本久久精品一区二区| 精品久久久噜噜噜久久久| 久久综合伊人77777麻豆| 久久精品午夜一区二区福利 | 亚洲狠狠婷婷综合久久久久| 99精品久久久久中文字幕| 精品久久久噜噜噜久久久 | 久久这里只有精品18| 亚洲а∨天堂久久精品| 国内精品久久久久伊人av| 久久久WWW成人| 国产精品美女久久久网AV| 久久99精品国产麻豆| 色婷婷噜噜久久国产精品12p| 午夜天堂av天堂久久久| 久久久久国产亚洲AV麻豆| 久久大香香蕉国产| 久久久久亚洲AV无码观看| 亚洲精品无码久久久久AV麻豆| 色综合久久中文字幕无码| 亚洲婷婷国产精品电影人久久| 久久97精品久久久久久久不卡| 久久精品夜夜夜夜夜久久| 欧美一区二区久久精品| 日韩十八禁一区二区久久| 91精品国产91久久| 精品久久人人爽天天玩人人妻| 亚洲乱亚洲乱淫久久| 欧洲人妻丰满av无码久久不卡 | 亚洲精品国产美女久久久| 国产精品久久久久久久人人看| 国产精品亚洲综合专区片高清久久久 | 99久久www免费人成精品| 国产精品9999久久久久| 久久99国产精品尤物| 久久天天躁狠狠躁夜夜网站| 久久亚洲AV成人出白浆无码国产| 中文字幕乱码人妻无码久久|