[英]confusion about int, char, and EOF in C
我正在學習K&R的經典C編程書第二版,這是第17頁的示例:
#include <stdio.h>
/* copy input to output*/
main()
{
int c;
// char c works as well!!
while ((c = getchar()) != EOF)
putchar(c);
}
在書中指出, int c
用於保存EOF
,在我帶有GCC的Windows機器中,結果為-1
,不能用char
表示。 但是,當我嘗試使用char c
它沒有問題。 奇怪的是我嘗試了更多:
int a = EOF;
char b = EOF;
char e = -1;
printf("%d %d %d %c %c %c \n", a, b, e, a, b, e);
並且輸出為-1 -1 -1
,不顯示任何字符(實際上根據%c, c
ASCII表%c, c
此處%c, c
應該顯示nbs(no-break space)
但它是不可見的)。
那么如何在沒有任何編譯器錯誤的情況下為EOF
分配char
?
此外,假設EOF
為-1
,則b
和e
是否都在內存中分配給FF
以上? 否則編譯器如何區分EOF
和nbs
...?
更新 :
最有可能的EOF 0xFFFFFFFF
被強制轉換為char 0xFF
但是在(c = getchar()) != EOF
中,LHS 0xFF
在比較之前被int提升為0xFFFFFFFF
,因此c
類型可以是int
或char
。
在這種情況下, EOF
恰好是0xFFFFFFFF
但理論上EOF
可以是任何需要8位以上的值才能正確表示的最左端字節(不一定是FFFFFF
因此char c
方法將失敗。
參考:K&R C編程語言2e
該代碼有效,因為您使用的是簽名 char
。 如果查看ASCII表 ,則會發現兩件事:首先,只有127個值。 127需要七個位來表示,而最高位是符號位。 其次, EOF
不在此表中,因此OS可以自由定義它。
編譯器允許從char
到int
賦值,因為您是從較小的類型分配為較大的類型。 保證int
能夠表示char
可以表示的任何值。
還需要注意的是0xFF
時解釋為等於255 unsigned char
和-1時,解釋為一個signed char
:
0b11111111
但是,當表示為32位整數時,它看起來非常不同:
255 : 0b00000000000000000000000011111111
-127: 0b11111111111111111111111110000001
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.