簡體   English   中英

"C中的符號擴展,char>unsigned char"

[英]sign extension in C, char>unsigned char

當我閱讀 K&R 時,我對這段代碼感到困惑:

#include "syscalls.h"
int getchar(void)
{
    char c;

    return (read(0, &c, 1) == 1) ? (unsigned char)c : EOF;
}

據說 unsigned char 用於避免代碼中符號擴展帶來的錯誤。 這是我能想到的唯一情況,我給出這個示例代碼:

char c = 0xf0; //11110000, just make highest bit > 1
printf("%i\n",(int)(unsigned char)c);
printf("%i\n",(int)c);

Output:  240 // 0...011110000
         -16 // 1...111110000

但實際上ascii只是0~127的最高位不能分配給1。為什么在K&R cast char >> unsigned char?

ASCII限制在0..127范圍內,但它不僅僅是可以通過read讀取的 ASCII - 在 K&R 中,它可以獲得整個0..255范圍的char值。

這就是getchar返回int的原因,因為它必須能夠返回任何char值以及與所有其他字符不同的特殊EOF值。

通過將字符轉換為unsigned char在返回時將其提升為int ,它可以防止值128..255被符號擴展。 如果您允許該符號擴展,您將無法區分 255(將符號擴展至所有 1 位)和EOF (即 -1,所有 1 位)之間的區別。


順便說一句,我不完全確定您使用 K&R 學習語言的策略是一個好的策略。 從那時起,C 已經走過了漫長的道路。 從記憶中,即使是最新的 K&R 書籍仍然是 C89/90 ANSI 標准(在 ISO 基本上接管之前),並且從那時起該語言已經經歷了兩次大規模升級。

unsigned char 變量的值介於 0 和 255 之間,對於類型轉換的要求,請遵循同一本書的評論

Whether plain chars are signed or unsigned is machine-dependent, but printable characters are always positive.
return (read(0, &c, 1) == 1) ? (unsigned char)c : EOF;

意思是:將一個字符讀入c; i如果您至少可以讀取一個字符,請返回它; 否則返回(int)EOF。

注意 getchar() 返回一個 int,因此轉換是 char->unsigned char->int

暫無
暫無

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

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