[英]How to use fscanf to take huge input from file into an struct. ANSI C89(90)
[英]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運算符
- ...
- sizeof運算符產生其操作數的大小( 以字節為單位 ),該操作數可以是表達式或類型的帶括號的名稱。 [...]
- 當應用於具有
char
,unsigned char
或signed 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.