C编程Char可能的值

Haa*_*nti 5 c char

我正在努力学习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)

它打印出一个 É

为什么是这样?

das*_*ght 5

根据C99标准,当c格式说明符被提供给printf没有l长度的修改器时,

int参数被转换为一个unsigned char,并将得到的字符被写入.

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

  • @Skyler取决于.在具有latin1语言环境的系统上,它(几乎可以肯定,它可能是实现使用不同的执行字符集)打印字母"É".在我的带有UTF-8语言环境的盒子上,它打印一个控制字符` `. (3认同)

Sky*_*ler 1

unsigned char c = 400;\nprintf("%d",c);\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

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

\n\n

400 = 110010000,有9位,所以最高的1会丢失,那么你实际分配给该字符的是10010000,即十进制的144。

\n\n

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

\n