繁体   English   中英

如何使用 %c output "A" 打印 577?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM