c语⾔char类型的相关知识点
过去在使⽤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;
c语言char的用法若按位与两操作数都为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型在进⾏运算。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。