4

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 では char >> unsigned char をキャストするのですか?

4

3 に答える 3

5

ASCII範囲に制限されています0..127が、読み取ることができるのは ASCII だけではありませんread。K&R では、値の0..255範囲全体を取得できcharます。

これが、任意の値に加えて、他のすべての文字とは異なる特別な値を返すことができる必要があったため、がgetchar返された理由です。int charEOF

戻り値unsigned charに昇格する前に文字を にキャストすることで、値が符号拡張されるのを防ぎました。その符号拡張を許可した場合、255 (すべての 1 ビットに符号拡張する) と(-1、すべての 1 ビット)の違いを見分けることができなかったでしょう。int128..255EOF


ところで、K&R を使用して言語を学習するというあなたの戦略が良いものであるかどうか、私は完全には確信が持てません。Cは当時から長い道のりを歩んできました。記憶によると、K&R の最新の書籍でさえ、C89/90 ANSI 標準 (ISO が基本的に責任を引き継ぐ前) 用であり、言語はそれ以来2 回の大規模なアップグレードを経ています。

于 2013-05-20T13:17:35.113 に答える
1

unsigned char 変数の値は 0 ~ 255 で、型キャストの要件については、同じ本のコメントに従ってください

Whether plain chars are signed or unsigned is machine-dependent, but printable characters are always positive.

C標準について話すと、以下のようになります

The implementation shall define char to have the same range, representation, and behavior as either signed char or unsigned char.
于 2013-05-20T13:25:17.033 に答える