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区别?

LinuxC语言中数据类型详解

3.通常的编译器实现遵守ILP32或LP64规范

LinuxC语言中数据类型详解
说明:
从现在开始本书做以下约定:在以后的陈述中,平台是x86/Linux/gcc,遵循ILP32,并且 char 是有符号的,我不会每次都加以说明。

4.整数常量

(1)C语言的常量有整数常量、字符常量、枚举常量和浮点数常量四种,其实字符常量和枚举常量的类型都是 int 型,因此前三种常量的类型都属于整型。

(2)八进制整数常量以0开,十六进制整数常量以0x或0X开头。

(3)整数常量的类型
LinuxC语言中数据类型详解
学习整数常量的类型有什么用?看下面的eg1
LinuxC语言中数据类型详解
LinuxC语言中数据类型详解
eg2:
LinuxC语言中数据类型详解

二、浮点型

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)实参和形参的关系
LinuxC语言中数据类型详解
(2)算数运算中的类型转换
LinuxC语言中数据类型详解
LinuxC语言中数据类型详解

2.Usual Arithmetic Conversion

(1)含义

LinuxC语言中数据类型详解

(2)转换规则和转换级别

LinuxC语言中数据类型详解

(3)由赋值产生的类型转换

LinuxC语言中数据类型详解

(4)getchar的返回值是int型

LinuxC语言中数据类型详解

(5)强制类型转换

LinuxC语言中数据类型详解

(6)编译器如何处理类型转换?

本节介绍编译器如何处理任意两种类型之间的转换。现在要把一个M位的类型(值为X) 转换成一个N位的类型,所有可能的情况如下表所示。
LinuxC语言中数据类型详解
说明:
LinuxC语言中数据类型详解
eg:
LinuxC语言中数据类型详解