[英]Displaying the ASCII characters in C without unsigned char
unsigned char a;
for(a=32;a<128;a=a+1)
printf("%d='%c'\t",a,a);
return(0);
為什么我必須放入未簽名的字符? 當我將其保留為char時,我執行了程序,它給了我無限循環。 當a = 127時不應該停止嗎?
char
表示它是signed
還是unsigned
取決於實現。 這樣就可以定義代碼實現的行為。
看來在您的計算機上它已signed
。 根據C標准,帶signed char
的最小值和最大值分別為-127
和+127
。 大於任何值127
或小於-127
不能被分配到a
,否則它會調用未定義的行為 。
后a
達到127
,它被加一,該值變為128
不能由一個被保持signed char
變量,因此該代碼調用未定義的行為。
在Visual Studio上,類型char
與帶signed char
相同,范圍為-128到+127(均包括在內),因此帶signed char
所有值都小於128。因此,始終滿足a < 128
的循環條件,並且循環永不停止。
當你擁有unsigned char
,價值a
到達某個點128不會有下一次迭代。 在更改中,如果您嘗試增加帶signed char
變量的值127(期望它采用值128),則結果是不確定的。 在大多數平台(包括Visual Studio)上,它將環繞(溢出,因為127是可能的最高值)到可能的最低值-128。
char
是帶符號的還是無符號的取決於實現,並且可能會因編譯器和目標體系結構而改變。
對於大多數(可能是所有現代)CPU體系結構,帶signed char
的范圍為-128 ... 127, unsigned char
的范圍為0 ... 255(請參見您的limits.h
,最小范圍為-127 ... 127,否上限)。
因此,對於您的示例, char
似乎已簽名。 由於在這里使用int
進行比較(類型強制-隱式轉換),因此循環的條件始終為true,因此循環永遠不會終止。
使用擴展范圍內的無符號收益,因此循環正常運行。
請注意,如果對char
進行算術運算,請始終使用顯式有signed
或unsigned
。 后者通常是更好的選擇。 如果啟用警告,則編譯器可能會幫助您。 但是,不要依賴於此(而是遵循顯示的警告)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.