c语言char类型的相关知识点

来源:互联网 发布:公开课推荐 知乎 编辑:程序博客网 时间:2024/06/09 23:53

过去在使用char类型时,只是单纯的将它理解为一个字符类型,最近写的一些代码里因为用到了char类型存整数,并涉及char型和int型的强制转化,所以将相关知识点一并总结如下。

1.char类型的本质其实就是开辟了一个字节的空间存储数字,当使用%d时输出数字,使用%c时输出ASCII对应的字符。

2.char默认为signed char类型,最大位为符号位,范围是-128到127.用补码的方式存储,-128存储为1000 0000(相当于将 -0设置为-128,多存一个数)。

3.将int型强转为char型时,直接截取低八位;char型强转int型时,保留char的值,然后高位补全(注意,如果char存负数,因为是补码,补0补1的问题)。

4.程序里面的字符常量是按int处理的,sizeof('A')与sizeof(65)等效;编译器, 对纯数字预设以int处理. 所以, 你直接印出'A', 'a'的大小, 会是int大小. 因为已经被转换成数字才真的编译。而sizeof('字符变量') 为1。


以下是一个相关代码测试:

#include <stdio.h>
int main()
{
char a = 254;  
printf("10进制形式:a=%d,254=%d\n",a,254);
printf("16进制形式:a=%x,254=%x\n",a,254);
int  b = (int)a; 
int  c = (int)(a&0xFF);
printf("10进制形式:b=%d,c=%d\n",b,c);
printf("16进制形式:b=%x,c=%x\n",b,c);
return 0;
}
在VS2008(32位编译器)编译运行后结果如下:
10进制形式:a=-2,254=254  //补码存储
16进制形式:a=fffffffe,254=fe 

/* 1、默认参数提升:如果一个函数的形参类型未知,那么调用函数时要对相应的实参做“整数提升(integer promotions)”,除此以外,float类型的参数会被提升为double。
printf符合1,因为它是形参类型未知 int printf(const char *,...)。所以char or unsigned char会做类型提升,提升为int,提升这个操作才涉及到符号扩展的原则。*/


10进制形式:b=-2,c=254 //b=-2符号位补全,c=254注意都是补码进行运算
16进制形式:b=fffffffe,c=fe

Point:16进制的输出我们可以看到运算的本质。(a&0xFF)时,因为0xFF默认是int型,所以要进行整型提升,a默认提升到int型进行按位与运算,得到结果0x000000fe

实验可以证明:int c = (unsigned char)0xfe  、int c = 0xfe、int  c = (int)(a&0xFF)结果是一样的,都为0x000000fe;
若按位与两操作数都为char,结果自然依旧为char
实验可以证明 int c = (char)0xfe 、int  c = (int)(a&(char)0xFF)结果一样,都为0xfffffffe;


注:关于整型提升(integral promotion)

K&R C中关于整型提升(integral promotion)的定义为:

"A character, a short integer, or an integer bit-field, all either signed or not, or an object of enumeration type, may be used in an expression wherever an integer maybe used. If an int can represent all the values of the original type, then the value is converted to int; otherwise the value is converted to unsigned int. This process is called integral promotion."

我理解为:char、short int、活整型位域(这几者带符号或无符号均可)的变量,以及枚举类型的对象;在进行表达式运算时,都会默认转为int(或unsigned int型)进行运算

例如:char a , b ,c;
           c=a + b;

           printf ( " the size of the result of a+b :%d " ,sizeof( a+b) ); //输出为4

           包括两个char位运算,也是先转成int型在进行运算。

原创粉丝点击