比较下面三个定义式的区别: int i = 1; char i = 1; char i = '1'; int用来定义整型变量,char用来定义字符型变量,要清楚的知道三个定义式的区别,可以比较它们在内存中的存储形式。 数据在内存中是以二进制形式存放的,而且是以补码表示的。一个正整数的补码和该数的原码(即该数的二进制形式)相同;如果数值是负的,求补码的方法是:将该数的绝对值的二进制形式,按位取反再加1。这里不对补码的知识做过多的讨论了。 int i = 1,则内存中的存储形式为:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 在讨论字符型数据以前,首先要明确一个“编码”的概念,即约定一套规则,将a、b、#等符号用二进制的形式表示出来,然后大家都遵守这个规则。美国信息交换标准码(ASCII)就是基于这样的目的产生的。那么我们现在来看下面两个定义式: char i = 1; char i = '1'; 将一个整型常量放到一个字符变量中,实际就是把以该整型常量表示的ASCII码放到内存单元中。(ASCII码是以十进制整数表示的) 将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是把该字符的相应ASCII代码放到存储单元中。 char i = 1;则i的ASCII就是1,在内存中就是0 0 0 0 0 0 0 1 char i = ‘1’;则i的ASCII就是字符‘1’的ASCII码49,就是0 0 1 1 0 0 0 1 上面是int和char的区别,它们的联系就是存储形式类似,就是一个是1个字节,一个是2个字节。int 可以用字符常量赋值,char也可以用整型常量赋值,它们之间的桥梁就是ASCII码,因为字符是与ASCII一一对应的。 #include <stdio.h> void main() { int a = 1; char b = 1; char c = '1'; if (a == b) { printf("a==b\n"); } else { printf("a!=b\n"); } if (a==c) { printf("a==c\n"); } else { printf("a!=c\n"); } if (b==c) { printf("b==c\n"); } else { printf("b!=c\n"); } printf("b = %d\n", b); printf("c = %d\n", c); } 输出: a==b a!=c b!=c b = 1 c = 49
1.首先char与int都分为signed与unsigned类型,默认情况下都是signed类型。
2.从长字节数据类型转换为短字节数据类型,会产生截断:
如从4字节的int类型转换成1个字节的char类型,则取int数据的最低的一个字节,将这个字节的数据赋给char型数据,且是有符号的,即首位为符号位;而如果是从int转换成unsignedchar类型,则整个一个字节都是数据,没有符号位。
-
#include <stdio.h>
-
int main()
-
{
-
int s=128;
-
unsigned char unChar=s;
-
char Char=s;
-
printf("%x\t%x\n",Char,unChar);//按16进制输出
-
printf("%d\t%d\n",Char,unChar);//按10进制输出
-
}
输出结果为:
2.从短字节类型转换为长字节类型
从char转换为int:则在前面的三个字节补符号位,即补上0xffffff(char的首位为1),或0x000000(char的首位为0)。
从unsignedchar转换为int,则前面补上0x000000.
-
#include <stdio.h>
-
int main()
-
{
-
int s1,s2;
-
unsigned char unChar=128;
-
char Char=128;
-
s1=(int)unChar;
-
s2=(int)Char;
-
printf("%x\t%x\n",s1,s2);//按16进制输出
-
printf("%d\t%d\n",s1,s2);//按10进制输出
-
}
3.ASCII码为1个字节,而第一位为符号类型。其非负数范围为0-127。
在此范围内的字符,强制转换为int之后,都可以得到其对应的ASCII值。
如:
chara=78;
intb=(int)a;
cout<<b;//结果为78