簡體   English   中英

用於表示ANSI(C89 / 90)C中的字節的類型?

[英]Type to use to represent a byte in ANSI (C89/90) C?

是否有標准投訴方法來表示ANSI(C89 / 90)C中的字節? 我知道,大多數情況下,一個字符恰好是一個字節,但我的理解是,這不能保證是這種情況。 另外,在C99標准中有stdint.h,但在C99之前使用了什么?

我特別想知道8位和“字節”(sizeof(x)== 1)。

char總是一個字節 ,但它並不總是一個八位字節 字節是存儲器的最小可尋址單元(在大多數定義中),八位字節是8位存儲器單元。

也就是說,對於所有實現, sizeof(char)始終為1 ,但limits.h CHAR_BIT宏定義了平台的字節大小,並不總是8位。 有些平台有16位和32位字節,因此char將占用更多位,但它仍然是一個字節。 由於char所需范圍至少為-127到127(或0到255),因此在所有平台上至少為 8位。

ISO / IEC 9899:TC3

6.5.3.4 sizeof運算符

  1. ...
  2. sizeof運算符產生其操作數的大小( 以字節單位 ),該操作數可以是表達式或類型的帶括號的名稱。 [...]
  3. 當應用於具有charunsigned charsigned char (或其限定版本)類型的操作數時,結果為1 [...]

強調我的。

您總是可以在unsigned char中表示一個字節(如果您的意思是8位)。 它始終至少為8位,所有位都構成該值,因此8位值始終適合它。

如果你想要8位,我也認為你必須使用平台相關的方式。 POSIX系統似乎需要支持int8_t。 這意味着在POSIX系統上,char(因而是一個字節)總是8位。

在ANSI C89 / ISO C90 sizeof(char)== 1.但是,並不總是1字節是8位的情況。 如果你想計算1個字節的位數(並且你沒有訪問limits.h),我建議如下:

unsigned int bitnum(void) {
    unsigned char c = ~0u; /* Thank you Jonathan. */
    unsigned int v;

    for(v = 0u; c; ++v)
        c &= c - 1u;
    return(v);
}

這里我們使用Kernighan的方法來計算c中設置的位數。 為了更好地理解上面的代碼(或者看到其他類似的代碼),我將您推薦給“ Bit Twiddling Hacks ”。

在C99之前? 與平台相關的代碼。

但你為什么關心? 只需使用stdint.h。

在CI的每個實現中都使用過(從舊的UNIX到由硬件工程師編寫的嵌入式編譯器到大型供應商編譯器), char一直是8位的。

你可以在boost中找到非常可靠的宏和typedef。

我注意到有些回答已經將字節重新定義為8位以外的東西。 字節是8位,但是在某些c實現中,char是16位(2字節)或8位(1字節)。 調用字節“最小可尋址存儲器單元”或某些垃圾的人已經忘記了字節(8位)的含義。 C的一些實現具有16位字符(2字節)並且一些具有8位字符(1字節)的原因,並且沒有稱為“字節”的標准類型,這是由於懶惰。

所以,我們應該使用int_8

暫無
暫無

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

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