[英]How does printing 577 with %c output "A"?
#include<stdio.h>
int main()
{
int i = 577;
printf("%c",i);
return 0;
}
编译后,它给出 output “A”。 谁能解释我是怎么得到这个的?
%c
将只接受最多包含 255 的值,然后它将再次从 0 开始!
577 % 256 = 65; // (char code for 'A')
这与值的转换方式有关。
%c
格式说明符需要一个int
参数,然后将其转换为unsigned char
类型。 然后写入生成的unsigned char
的字符。
C 标准的第 7.21.6.1p8 节关于printf
的格式说明符说明了以下关于c
的内容:
如果不存在
l
长度修饰符,则int
参数将转换为unsigned char
,并写入结果字符。
将值转换为较小的无符号类型时,实际上会发生高位字节被截断而低位字节具有结果值的情况。
第 6.3.1.3p2 节关于整数转换状态:
否则,如果新类型是无符号的,则在新类型可以表示的最大值的基础上重复加减一,直到该值在新类型的范围内。
当使用二进制补码表示时,这与截断高位字节相同。
对于int
值 577,其十六进制值为 0x241,低位字节为 0x41 或十进制 65。在 ASCII 中,此代码是字符A
,即打印的内容。
十六进制的 577 是 0x241。 'A'
的 ASCII 表示是 0x41。 您将int
传递给printf
但然后告诉printf
将其视为char
(因为%c
)。 char
是一个字节宽,因此printf
查看您给它的第一个参数并读取最低有效字节 0x41。
要打印整数,您需要使用%d
或%i
。
只需以十六进制表示形式输出变量i
的值
#include <stdio.h>
int main( void )
{
int i = 577;
printf( "i = %#x\n", i );
}
程序输出将是
i = 0x241
所以最低有效字节包含十六进制值0x41
,它代表字母'A'
的 ASCII 码。
使用 %c 打印 577 如何输出“A”?
使用printf()
。 "%c"
匹配一个int
参数*1 。 int
值转换为unsigned char
值 65,然后打印相应的字符*2 'A'
。
如果一个char
是有符号或无符号或用 2 的补码编码的,这没有区别。 没有未定义的行为(UB)。 参数的传递方式、堆栈、寄存器或 ... 没有区别。 int
的字节序无关紧要。 参数值被转换为unsigned char
并打印相应的字符。
*1允许所有int
值[INT_MIN...INT_MAX]
。
当char
值作为...
参数传递时,它首先被转换为int
然后传递。
char ch = 'A';
printf("%c", ch); // ch is converted to an `int` and passed to printf().
*2 65 是 ASCII A
,即普遍存在的字符编码。 很少使用其他编码。
它不必输出A
。 在您的情况下恰好这样做,因为%c
使它占用一个字节(最有可能从堆栈中)并且它发现int
的一部分恰好代表A
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.