我正在努力学习C,现在我正在学习字符.我已经读过一些字符可以签名和未签名的地方.这部分我得到但是当我使用unsigned char(我认为它可以保持0-255的值)
printf("%c", 400);
Run Code Online (Sandbox Code Playgroud)
甚至
printf("%c\n", (unsigned char)400);
Run Code Online (Sandbox Code Playgroud)
它打印出一个 É
为什么是这样?
根据C99标准,当c格式说明符被提供给printf没有l长度的修改器时,
该
int参数被转换为一个unsigned char,并将得到的字符被写入.
这意味着400被转换为a unsigned char,即400 % 256,或144.然后,144写出对应的字符.这是一个UNICODE控制序列,因此É您看到的字符与系统有关.
unsigned char c = 400;\nprintf("%d",c);\nRun Code Online (Sandbox Code Playgroud)\n\n你猜怎么着,你会被144打印出来。那是因为.c
Anunsigned char恰好占用 8 位内存(几乎在每个平台上),因此它是一个范围在00000000 (0) ~ 11111111 (255) 的变量。每当您尝试将二进制超过 8 位的数字分配给 unsigned char 时,左侧多余的位将溢出并丢失。
在您的情况下,您尝试将 400 分配给无符号字符:
\n\n400 = 110010000,有9位,所以最高的1会丢失,那么你实际分配给该字符的是10010000,即十进制的144。
\n\n当你将其打印为 时%d,你会得到144;当您将其打印为 时%c,您将得到扩展 ASCII 代码\xc3\x89中的第 144 个字符(在您的情况下)。