c语言中关于char的疑问
(这是不是与int可以以几位存储无关?) 展开
在解答题前,先了解下各个字母的ascii值,十六进制的,便于解答
字母A:0x41 B:0x42 C:0x43 D:0x44
--------
char a='A';
可以理解成:
char a=(char)0x41;
----------
char a='BA'
可以理解成:
char a=(char)0x4241;
强制转换后a=0x41
---------
int i='DCBA'; //注意是int类型
可以理解成:
int i=(int)0x44434241;
----------
从上面几个说明你应该可以看出点端倪。
char a='BA';这个语句它是个赋值过程,BA也不是在内存中的字符串,它是由编译器编译的代码实现直接把0x41这个值放到a变量。
总结下:
单引号里的字符不属于字符串,它属于在编译的时候处理的东西,它不会存在于运行的内存当中,在编译过程中转换成对应的ascii码值。
下面图片很好的说明了这个问题,注意红色框,不明白可以追问:
1,字母以ASCii码存储与内存里,int a=‘A’;配合%c也可以输出A(以此类推以int应该可以表示ASCII里面可以用数字表示的所有字符),那char类型还有什么用处?
2,为什么char a='ABCD'时强制转换后只有最后一个字母D的asciii码而不是第一个字母的ASCII码??
回答1.char类型只占1字节,int类型占4字节,double类型占8字节,那为什么不用double取代int。当然double类型比int类型计算耗cpu,所以不可能取代,这是主要原因。
那么int类型和char类型计算耗cpu时钟基本一样,那为什么不能取代,1.所占空间不一样。
比如struct{
char c1;
char c2;
char c3;
char c4;
int i1;
}
这个结构占8字节。
把上面结构char类型改int类型,那么将占用20字节。如果是大数据量,浪费多少字节,所以尽量用合适的数据类型。
2。一字节是8bits,正好是char类型来表示。里面有很多细节问题,就不一一多说。
一个char类型占1个字节(8位)
C语言中,一个字符是8位ASCII码组成的
也就是说一个字符需要1个字节的内存空间
所以,1个char类型对应1个字符,要想读取多个字符,得用char类型的数组。
char 单个字母 = ‘a’;
char[] 多个字符 = "abc";
所以printf("%d , %d , %d\n" , ch , ch + 1 , ch + 2);输出-1,0,1