我写了以下程序,
#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
我无法理解为什么?
答案 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字符常量)
- ...包含多个字符(例如&#39; ab&#39;)或包含字符或转义字符的整数字符常量的值 没有映射到单字节执行字符的序列是 的实现定义即可。
醇>
答案 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
,则使用printf
在char
中打印的行为可能未定义。
答案 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数组转换为整数。