使用int打印字符常量

时间:2017-12-12 13:02:42

标签: c int

我写了以下程序,

#include<stdio.h>
int main(void)
{
int i='A';
printf("i=%c",i);
return 0;
}

我得到了结果,

i=A

所以我尝试了另一个程序,

#include<stdio.h>
int main(void)
{
int i='ABC';
printf("i=%c",i);
return 0;
}

据我所知,因为32位用于存储int值,'A','B'和'C'各有8位ASCII码,总共24位,因此24位存储在32位单元。所以我期望输出是,

i=ABC

但是输出是

i=C 

我无法理解为什么?

5 个答案:

答案 0 :(得分:1)

在这种情况下,'ABC'是一个整数字符常量,根据标准的 6.4.4.4.10 部分。

  

整数字符常量的类型为int。整数的值   包含映射到a的单个字符的字符常量   单字节执行字符是数值   解释为整数的映射字符的表示形式。该   包含多个的整数字符常量的值   字符(例如,'ab'),或包含字符或转义序列   没有映射到单个执行字符的是   实现定义。如果整数字符常量包含a   单个字符或转义序列,其值是产生的值   当一个char类型的对象,其值是单个的   字符或转义序列转换为int。

在这种情况下,'A'==0x41'B'==0x42'C'==0x43您的编译器会将i解释为0x414243。如在另一个答案中所述,该值取决于实现。

当您尝试使用'%c'访问它时,溢出的部分将被剪切,您只剩下0x43,即'C'

要了解更多信息,请阅读this question的答案。

答案 1 :(得分:1)

此次调用中使用的转化说明符c

printf("i=%c",i);

实际上从整数参数中提取一个字符。因此,在任何情况下使用此说明符都不能获得三个字符作为输出。

来自C标准(7.21.6.1 fprintf函数)

  

c如果不存在l length修饰符,则将int参数转换为   一个unsigned char,结果字符写成

考虑到多字节字符常量的内部表示是实现定义的。从C标准(6.4.4.4字符常量)

  
      
  1. ...包含多个字符(例如&#39; ab&#39;)或包含字符或转义字符的整数字符常量的值   没有映射到单字节执行字符的序列是   的实现定义即可。
  2.   

答案 2 :(得分:1)

'ABC'整数字符常量。根据代码集(压倒性的是ASCII),endian,int宽度(在OP的情况下显然为32位),它可能具有如下所示的相同值。它是实现定义的行为。

'ABC'
0x41424300
0x434241
or others.

"%c"指示printf()获取int值,将其转换为unsigned char并打印相关字符。这是明显丢失信息的主要原因。

在OP的情况下,似乎i取值为0x434241。

int i='A';
printf("i=%c",i); --> 'A'
// same as 
printf("i=%c",0x434241); --> 'A'

答案 3 :(得分:0)

在C中,'A'int 常量,保证适合char

'ABC'多角色常量。它具有int类型,但实现定义值。如果值不适合%c,则使用printfchar中打印的行为可能未定义

答案 4 :(得分:0)

如果你想要我包含3个字符,你需要初始化一个包含3个字符的数组

char i[3]; i[0]= 'A'; i[1]= 'B'; i[2]='C';

&#39; &#39;只能包含一个char,你的代码将整数i转换为一个字符,或者更好地存储在你的32位intiger转换后的8位字符中。但我认为你想将32位分成8位容器,使char数组像char i [3]。然后你会看到

int j=i;

这将导致错误,因为您无法将char数组转换为整数。