5

我正在尝试学习 C,现在我正在学习字符。我读过一些可以签名和未签名的字符的地方。这部分我得到了,但是当我使用无符号字符时(我认为它可以保持值 0-255)

printf("%c", 400); 

甚至

printf("%c\n", (unsigned char)400);

它打印出一个É

为什么是这样?

4

2 回答 2

5

根据C99 标准,当c提供格式说明符printf而没有l长度修饰符时,

int参数转换为,unsigned char并写入结果字符。

这意味着 400 被转换为unsigned char, 即400 % 256, 或144144然后,写出对应的字符。这是一个UNICODE 控制序列,因此É您看到的字符是系统相关的。

于 2012-12-30T14:27:33.547 回答
1
unsigned char c = 400;
printf("%d",c);

你猜怎么着,你会被144打印出来的。那是因为c.

Anunsigned char恰好占用 8 位内存(几乎在每个平台上),因此它是00000000 (0) ~ 11111111 (255) 范围内的变量。每当您尝试将超过 8 位的二进制数分配给 unsigned char 时,剩余的多余位将溢出并丢失

在您的情况下,您尝试将 400 分配给无符号字符:

400 = 110010000有 9 位,所以最高的 1 会丢失,然后你得到10010000实际分配给 char,即十进制的 144。

当您将其打印为 时%d,您将得到144;当您将其打印为 时%c,您将得到扩展 ASCII 代码É中的第 144 个字符(在您的情况下)。

于 2012-12-30T14:31:27.177 回答