C语言char类型及其类型转换的变化

目录:

char类型
转义字符

char类型

首先我们要知道char类型为一个字节。 而且要知道他在计算机中的储存方式。 一个字节8个bite,int类型32bite,0x00 00 00 01刚好没量为数为一个字节,这正是内存的储存方式 例如
char a=5;//a=0000 0101  正数的源码补码反码相同
char b=-5;//  b=1000 0101(源码)-》1111 1011(补码)
int x=(int)a;//x=00 00 00 05(16进制),在这里涉及类型变换时的扩充,当正数扩充时需要在他前面补0
int y=(int)b;//y=ff ff ff fb,负数的扩充则需要在他前面补f

同理类型转换时有扩充自然也会有缩减,缩减时,只需将多出来的位数删去就好。
现在我们来看例题

char ch=130;
print("%d",ch);//会输出-126,这是应为有符号char的范围是127到-128
//ch的值超过127时就会自动转换为补码形式,且该值作为补码存放
//130=1000 0010(补)单从补码来看这是一个负数
//那么他的原码就是1111 1110(-126)

在例如

char a=100;//a=0110 0100(原,补)
char b=200;//b=1100 1000(补,因为超过127所以直接作为补码处理)
char c=a+b;//a+b时会扩充为int类型处理再相加,然后在缩减为char类型
printf("%d,%d",c,a+b);

在这里插入图片描述
这个结果不是说明他们两个的值一定相同,这只是在当前的赋值情况下会出现一样的结果,实际情况需要计算。
下面来解释说明
要算a+b所以
a转换为int的结果为
a=0000 0000 0000 0000 0000 0000 0110 0100
b=1111 1111 1111 1111 1111 1111 1100 1000
a+b=1 0000 0000 0000 0000 0000 0000 0010 1100
注意最前面那个1不是符号位,那只是溢出的一位数,真正的符号为还是第二个0,所以就a+b的int类型结果来说总的结果为44,同时缩减后变为char类型的结果是0010 1100=44.
所以两份结果是这么得出的。

接着再来看一个例题
先告诉你unsigned char范围为0-255

unsigned char x=100;
unsigned char y=200;
unsigned char z=x+y;
printf("%d,%d",z,x+y);

在这里插入图片描述
x=0110 0100
y=1100 1000
x+y=
0000 0000 0000 0000 0000 0000 0110 0100
0000 0000 0000 0000 0000 0000 1100 1000
0000 0000 0000 0000 0000 0001 0010 1100
x+y(的int类型结果为300)
当转换为char类型的char时就将前3个字节个去掉了所以剩下了44

关于转义字符的内容

void main()
{
	//char a = '\'',b='\\',c='\r';//  \是转义符
	//cout << a << endl;
	//cout << b<< endl;
	//cout << c << endl;
	//int x = 'avb';
	//int y = 'a';
	//int z = 'v';
	//int f = 'b';
	//int h = y*z*f;
}

char a = ‘’’,b=’\’,c=’\r’; \是转义符
通过转义符可以得到某些特殊的字符的本身
如果只是简单赋值如:char ch=‘’‘;想得到一个单引号字符,这样的操作是无法通过编译的。
例如我们想要在字符串中输入一个特殊的名字如:“c++“hm”
如果简单的写为:char str[30]={" llj “c++ "hm "};这样是无法得到正确的答案的
我们需要使用转义符

char str[30]={" llj \“c++ \"hm "}

这样使用转义符,就可以把某些界限符的意义转为其他含义,如’ ‘是字符的界限符,” “是字符串的界限符。
再举一个例子:int x='4';那么x的值为字符4对应的ascii值
但是如果写为 int x=’\4’;那么x的值就为4。

int x="\1\2\3\4\5\6\7"[2];

上面x的值为3;
首先整个字符串通过转义变为了“1234567”这样七个字符,而后面的[2]则是代表着下标访问第二个数据,所以得到的刚好是第三个字符3;之所以能访问是因为,在这个字符串中\1\2\3等每个数都为一个字节,那么下标2,相当于第三个数,也就是第三个字节的内容。

关于转义符的其他用法:
特殊的两种转义形式:

\ddd 三位八进制
\xhh 二位十六进制

char *str="dawf\205dfd";
int len=strlen(str);
prinf("%d",len)

len的答案是8,在这\205是一个8进制的数,只有这个数转化为十进制后的数不大于255,那么就可以转义为对应8进制值的ascii字符。

char *str="dawf\x20dfd";

这时\x20是一个16进制20的一个数,这是转义的另一种形式,对应不同的操作符,会有不同的效果,只要它对应的10进制数没有超过255,那么就可以转义为对应的ascii字符

你可能感兴趣的:(C语言)