我正在尝试学习 C,现在我正在学习字符。我读过一些可以签名和未签名的字符的地方。这部分我得到了,但是当我使用无符号字符时(我认为它可以保持值 0-255)
printf("%c", 400);
甚至
printf("%c\n", (unsigned char)400);
它打印出一个É
为什么是这样?
根据C99 标准,当c
提供格式说明符printf
而没有l
长度修饰符时,
int
参数转换为,unsigned char
并写入结果字符。
这意味着 400 被转换为unsigned char
, 即400 % 256
, 或144
。144
然后,写出对应的字符。这是一个UNICODE 控制序列,因此É
您看到的字符是系统相关的。
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 个字符(在您的情况下)。