C语言当中各种数据类型的大小,首先要了解有哪些数据类型。
一 字符型:
整数(字符)类型 | 存储大小 | 值范围 |
---|---|---|
char | 1 字节 | -128 到 127 或 0 到 255(2的8次方) |
unsigned char | 1 字节 | 0 到 255() |
signed char | 1 字节 | -128 到 127() |
对于字符而言,本质上还是数字,只不过存放的是字符的ASCII码值,根据ASCII码表显示字符。
二 整数类型:
在64位系统的编译环境下:
整数类型 | 存储大小 | 值范围 |
---|---|---|
int | 4 字节 | -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647 |
unsigned int | 4字节 | 0 到 65,535 或 0 到 4,294,967,295 |
short | 2 字节 | -32,768 到 32,767 |
unsigned short | 2 字节 | 0 到 65,535 |
long | 8字节 | -2,147,483,648 到 2,147,483,647 |
unsigned long | 8字节 | 0 到 4,294,967,295 |
知识补充 :
有符号整数(signed)
有符号整数通常采用二进制补码形式来表示。补码表示法允许我们使用一个固定数量的位(bit)来表示正数、负数和零。补码表示法的关键之处在于它使得加法运算在包括负数的情况下也能保持简单性。
对于有符号整数:
- 最高位(最左边的位) 是符号位。0表示正数或零,1表示负数。
- 剩下的位用于表示整数的数值部分(或称为幅度)。
补码计算
- 正数的补码就是其本身。
- 负数的补码是其绝对值的二进制表示(原码)取反后加一。
例如,一个8位的有符号整数:
- +5 的原码、反码和补码都是
0000 0101
- -5 的原码是
1000 0101
,反码是1111 1010
,补码是1111 1011
无符号整数(unsigned)
无符号整数则直接使用所有位来表示整数的数值部分,没有符号位。因此,无符号整数的范围是从0到2^n-1,其中n是整数的位数。
例如,一个8位的无符号整数可以表示的范围是0到255(即0000 0000到1111 1111)。
存储和解释
在内存中,有符号和无符号整数都是以二进制的形式存储的。它们之间的区别主要在于我们如何解释这些二进制位。当我们读取一个整数值时,如果我们将其解释为有符号的,那么计算机会使用补码规则来解释最高位作为符号位;如果我们将其解释为无符号的,那么计算机会将所有位都视为数值部分。
示例
假设我们有一个8位的二进制数 1000 0001
:
- 如果我们将其解释为有符号整数,那么它表示的是-127(这是-1的补码表示)。
- 如果我们将其解释为无符号整数,那么它表示的是129。
三浮点型:
不同的浮点型,我们往往不需要那么高的精度去存储,有时候常常约束小数部位。
浮点类型 | 存储大小 | 值范围 | 精度 |
---|---|---|---|
float | 4 字节 | 1.2E-38 到 3.4E+38 | 6 位有效位 |
double | 8 字节 | 2.3E-308 到 1.7E+308 | 15 位有效位 |
long double | 16 字节 | 3.4E-4932 到 1.1E+4932 | 19 位有效位 |
四 布尔类型:
在C语言标准中,并没有直接定义布尔(boolean)类型。然而,从C99标准开始,C语言引入了一个头文件 <stdbool.h>
,该头文件定义了布尔类型以及两个宏:true
和 false
。
所以要使用布尔类型 ,必须包含头文件<stdbool.h>
当你包含 <stdbool.h>
头文件后,你可以使用 bool
作为布尔类型,由于布尔类型大小只有一个bit位,只能表示0和1,所以我们往往用它表示真假或者表示对错。对于单片机当中常常用于
true
(1)和 false(0)
作为布尔值。这使得可以调用函数的时候可以判断程序执行有无问题。
整数类型 | 存储大小 | 值范围 |
---|---|---|
bool | 1 bit | true (1), false(0) |
对于结构体由于计算内存大小比较特殊,我单独写在自定义数据类型当中。