簡體   English   中英

C和C ++中的積分/算術類型的大小保證

[英]size guarantee for integral/arithmetic types in C and C++

我知道C ++標准明確地保證了charsigned charunsigned char 此外,它還提供了保證,例如, short至少與charintshort等一樣大。但是沒有關於sizeof(int)絕對值的明確保證。 這是我頭腦中的信息,我和它幸福地生活在一起。 不久前,我在SO中找到了一條評論(找不到它),在C long中保證至少有4個字節,並且該要求是由C ++“繼承”的。 是這樣的嗎? 如果是這樣,我們對C ++中算術類型的大小有什么其他的隱含保證? 請注意,我對這個問題中不同平台的實際保證完全不感興趣,只是理論上的保證。

18.2.2保證<climits>具有與C庫頭<limits.h>相同的內容。

ISO C90標准很難掌握,考慮到C ++依賴它,這是一種恥辱,但是“數值限制”一節(在我隨機追蹤的一個隨機草案中編號為2.2.4.2並且已經四處放置)給出了<limits.h> INT_MAX等常量的最小值。 例如, ULONG_MAX必須至少為4294967295,我們從中推斷出long的寬度至少為32位。

C99標准中有類似的限制,但當然不是C ++ 03引用的那些。

這並不能保證long至少為4個字節,因為在C和C ++中,“byte”基本上定義為“char”,並且不能保證CHAR_BIT在C或C ++中是8。 POSIX和Windows都保證CHAR_BIT == 8

不了解C ++。 在C你有

Annex E
                              (informative)


                          Implementation limits

       [#1]  The contents of the header  are given below,
       in alphabetical order.  The minimum magnitudes  shown  shall
       be  replaced  by  implementation-defined magnitudes with the
       same sign.  The values shall  all  be  constant  expressions
       suitable  for  use  in  #if  preprocessing  directives.  The
       components are described further in 5.2.4.2.1.

               #define CHAR_BIT                         8
               #define CHAR_MAX    UCHAR_MAX or SCHAR_MAX
               #define CHAR_MIN            0 or SCHAR_MIN
               #define INT_MAX                     +32767
               #define INT_MIN                     -32767
               #define LONG_MAX               +2147483647
               #define LONG_MIN               -2147483647
               #define LLONG_MAX     +9223372036854775807
               #define LLONG_MIN     -9223372036854775807
               #define MB_LEN_MAX                       1
               #define SCHAR_MAX                     +127
               #define SCHAR_MIN                     -127
               #define SHRT_MAX                    +32767
               #define SHRT_MIN                    -32767
               #define UCHAR_MAX                      255
               #define USHRT_MAX                    65535
               #define UINT_MAX                     65535
               #define ULONG_MAX               4294967295
               #define ULLONG_MAX    18446744073709551615

所以char <= short <= int <= long <= long long

CHAR_BIT * sizeof(char)> = 8
CHAR_BIT * sizeof(短)> = 16
CHAR_BIT * size of(int)> = 16
CHAR_BIT * sizeof(long)> = 32
CHAR_BIT * sizeof(long long)> = 64

是的,C ++類型大小繼承自C89。

我現在找不到規格。 但它在聖經中

請注意,這些類型的保證范圍比大多數機器寬一個:

簽名char -127 ... +127保證但大多數二人補充機器有-128 ... + 127

同樣適用於較大的類型。

你讀到的內容有幾處不准確之處。 這些不准確性要么存在於源中,要么您可能都記錯了。

首先,關於C和C ++之間的一個獨特差異的迂腐評論。 C語言不保證整數類型的相對大小 (以字節為單位)。 C語言只保證它們的相對范圍 確實, int的范圍始終至少與short的范圍一樣大,依此類推。 但是,C標准正式允許sizeof(short) > sizeof(int) 在這種情況下,額外的位short填充位 ,不用於值表示。 顯然,這只是標准中的法律語言所允許的,而不是任何人在實踐中可能遇到的事情。

另一方面,在C ++中,語言規范保證了類型的相對范圍和相對大小 ,因此在C ++中除了從C繼承的上述范圍關系之外,還保證sizeof(int)大於或等於sizeof(short)

其次,C語言標准保證了每個整數類型的最小范圍(這些保證在C和C ++中都有)。 知道給定類型的最小范圍,您可以總是說這個類型需要多少個值形成 (最小位數)。 例如,類型long確實需要具有至少32個值形成位以滿足其范圍要求。 如果要將其重新計算為字節 ,則取決於您在術語字節下理解的內容。 如果你特別談論8位字節,那么long類型總是至少包含4個8位字節。 但是,這並不意味着sizeof(long)總是至少為4,因為在C / C ++術語中,術語byte指的是char對象。 char對象不限於8位。 在某些實現中很可能有32位char類型,這意味着例如C / C ++字節中的sizeof(long)可以合法地為1。

C標准沒有明確表示long必須至少為4個字節,但它們確實為不同的整數類型指定了最小范圍,這意味着最小的大小。

例如, unsigned long整數的最小范圍是0到4,294,967,295。 您需要至少32位來表示該范圍內的每個數字。 所以是的,標准保證(間接) long是至少32位。

C ++從C繼承數據類型,因此您必須查看C標准。 在這種情況下,C ++標准實際上引用了C標准的各個部分。

請注意一些機器的字符超過8位的事實。 例如,TI C5x上的IIRC,長為32位,但sizeof(long)== 2,因為chars,short和int都是16位,sizeof(char)== 1。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM