[C语言]关于int类型和char转换

int类型为4字节,char为1字节,那么
int x=97; //存储0x0061 对吧
printf("%c",x); //答案为a,不知道是怎么实现的

以下是我一个测试:
int a[2]=(1,1);
scanf("%s", a);
printf("%d %d\n", a[0], a[1]);

输入&输出:
a&97 1
abc&6513249 1
abcd&1684234849 0
(最后这个0如果是被\0取代,应该只有1byte啊)
不太懂,求教!
a[2]={1,1} ==> 此时0x00 00 00 01 00 00 00 01(8个字节)对吗

第1个回答  2014-05-28
int x=97; //
printf("%c",x); //答案为a,不知道是怎么实现的
说明:因为你的x是整型,你下面要输出字符型,编译器就会输出ASSIC码为这个整型数所对应的字符,十进制97所对应的字符是'a',所以输出a
补充:A~Z对应的ASSIC码为65~90,a~z对应的ASSIC码为97~122,当你对边输入一个很大的整数时,编译器找不到这个整数所对应的字符,就会随机输出一个字符,比如输出1啊,0啊等等追问

任何长度为3以内的,a[1]的结果都是1。我理解是:
char是一个字节,所以当我按照string输入abd时,刚好(包括'\0')把第一个int占住了,当输入abcd以上的就把a[1]影响了。但具体怎么影响不知道

第2个回答  2014-05-28
电脑存储都是以ASCII码存储的,你int x=97,存在计算机上的数值就是97,你用%c打印,就调用97的对应的字符‘a’。你去查ASCII码表,可以找到对应的。追问

我是想从字节存储的角度来理解一下的。97存储时不应该是0x00 00 00 61吗?
尤其下面我自己测试的时候那些值得来源完全不清楚

追答

这是16进制的,97是10进制。电脑存储都是16进制。

第3个回答  2014-05-28
整型数字和ASCII字符是数字对应,
你可以按照ASCII表来对应字符--数字追问

具体存储是怎么实现的呢,你看我的测试
int a[2]=(1,1);
scanf("%s", a);
printf("%d %d\n", a[0], a[1]);

这些结果不太明白是怎么来的

追答

你的测试是
a[2]={1,1}
数组初始为1,1两个数字,但是你按照字符串方式修改了数组内容,这样
如果正好是一位字符的话,输入a,得到a[0]=97,a[1]=1
如果是abc、abcd等,会导致数组溢出,a[0],a[1]就不确定了,在内存里瞎胡跑了

追问

任何长度为3以内的,a[1]的结果都是1。我理解是:
char是一个字节,所以当我按照string输入abd时,刚好(包括'\0')把第一个int占住了,当输入abcd以上的就把a[1]影响了。但具体怎么影响不知道

追答

只要指针指向的内存不溢出,不会影响到后面的数值。
至于准确的表达,要看物理存储的格式,字符是以十六进制数存在内存里,从a[0]到a[1]有一定的距离,需要研究更深层次的C内存与数组的物理存储关系。
你的想法具有一定道理。

相似回答