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型在进行运算。
- c语言char类型的相关知识点
- C语言相关知识点
- C语言内存相关的一些知识点
- C语言中的char类型
- C语言数组相关知识点
- C语言指针相关知识点
- C语言字符串相关知识点
- 栈的C语言实现及相关知识点总结
- C语言之char类型研究
- C语言笔记 lesson4 char类型
- C语言的知识点
- c语言的知识点
- C语言内存管理相关知识点
- C语言中基本类型char、short、int、long等类型的取值范围
- 黑马程序员--c语言:进制、变量的内存分析、类型说明符、位运算、char类型、数组
- C语言中基本类型char、short、int、long等类型的取值范围
- c语言中char类型转int类型
- C语言char类型和int类型相互转换问题
- Window平台Git-Bash的主题配置
- Google系 900个实用图标的Axure元件库助你原型无忧
- 打印机状态码解析
- SSM下添加javamelody监控。以及遇到的部分问题的解决
- resin安全配置 只允许指定ip访问resin-admin 拒绝某些ip访问webapp
- c语言char类型的相关知识点
- 【科大讯飞2017年笔试题】课程冲突
- 显示所有进程号
- Codeforces Round #434 (Div. 2, based on Technocup 2018 Elimination Round 1) D
- ActiveX,NPAPI,COM总结
- new Option()函数的作用
- 对Excel工作表Sheet1快速隐藏行和列无需手动一个个选择
- C中不安全的函数以解决办法汇总
- Oracle建立表空间和用户