LinuxC语言中数据类型详解
文章目录
一、整型
1.我们常用的char型是无符号数还是有符号数?
(1)在C语言中 char 型占一个字节的存储空间,一个字节通常是8个bit。
- 如果这8个bit按无符号整数来解释,取值范围是0~255。
- 如果按有符号整数来解释,取值范围是-128~127。
(2)x86平台的 gcc 定义 char 型是有符号的。
(3)如果你要写可移植的代码,就必须清楚哪些写法是不可移植的。
(4)ASCII码的取值范围是0~127,所以不管 char 型是有符号的还是无符号的,存一个ASCII码都没有问题。
- 一般来说,如果用 char 型存ASCII码字符,就不必明确写是signed 还是 unsigned
- 如果用 char 型表示8位的整数,为了可移植性就必须写明是 signed 还是unsigned
2.Implementation-defined、Unspecified和Undefined区别?
3.通常的编译器实现遵守ILP32或LP64规范
说明:
从现在开始本书做以下约定:在以后的陈述中,平台是x86/Linux/gcc,遵循ILP32,并且 char 是有符号的,我不会每次都加以说明。
4.整数常量
(1)C语言的常量有整数常量、字符常量、枚举常量和浮点数常量四种,其实字符常量和枚举常量的类型都是 int 型,因此前三种常量的类型都属于整型。
(2)八进制整数常量以0开,十六进制整数常量以0x或0X开头。
(3)整数常量的类型
学习整数常量的类型有什么用?看下面的eg1
eg2:
二、浮点型
1.大部分平台的浮点数, float 型通常是32位, double 型通常是64位
2.在x86平台上,大多数编译器实现的 long double 型是80位, gcc 实现的 long double 型是12字节(96位)。
3.没有后缀的浮点数常量是 double 型的,有后缀f或F的浮点数常量是 float 型的,有后缀l或L的浮点数常量是 long double 型的。
三、类型转换:了解有符号数和无符号数混用问题
1.Integer Promotion
(1)实参和形参的关系
(2)算数运算中的类型转换
2.Usual Arithmetic Conversion
(1)含义
(2)转换规则和转换级别
(3)由赋值产生的类型转换
(4)getchar的返回值是int型
(5)强制类型转换
(6)编译器如何处理类型转换?
本节介绍编译器如何处理任意两种类型之间的转换。现在要把一个M位的类型(值为X) 转换成一个N位的类型,所有可能的情况如下表所示。
说明:
eg: