簡體   English   中英

在C中顯示ASCII字符而無符號字符

[英]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進行算術運算,請始終使用顯式有signedunsigned 后者通常是更好的選擇。 如果啟用警告,則編譯器可能會幫助您。 但是,不要依賴於此(而是遵循顯示的警告)。

暫無
暫無

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

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