本文将会对C语言中的基本类型相关知识进行介绍,并且对于整型在内存的存储规则进行详细介绍。 本文章将参考书籍《C Primer Plus (第六版)》来阐述基本概念知识。`一、数据类型
1、变量与常量数据
有些数据类型在程序使用之前已经预先设定好了,在整个程序的运行过程中没有变化,这些称为常量(constant)。
另一些数据类型在程序运行期间可能会被改变或者赋值,这些称为变量(variable)。
#include#define constant 5 //这里的constant是一个常量,被定义成 5 int main() { int variable = 3; //这里的varialbe是一个变量,他的值为3 printf("constant:%dnvariable:%dn", constant, variable); return 0; }
当我们尝试改变他们的值的时候就会发现
constant = 3; //改变一个常量的值是不合法的 variable = 5; //变量的值是可以改变的
2、使用const修饰变量
const int variable = 3;//定义名为variable的变量 variable = 5;//这里的variable被const修饰后具有不可修改的特性(该特性可突破)
3、数据类型关键字
不仅变量和常量不同,不同的数据类型之间也有差异(使用的内存空间大小与存取规则差异)。一些数据类型表示数字,一些数据类型表示字母(字符).C通过识别一些基本的数据类型来区别和使用这些不同的数据类型。
整型家族:
char: 字符数据类型
unsigned char - 无符号
signed char - 有符号
short: 短整型
unsigned short - 无符号短整型
signed short - 有符号短整型
int :整型
unsigned int - 无符号标准整型
signed int - 有符号标准整型
long:长整型
unsigned long - 无符号长整型
signed long - 有符号长整型
上述的整型中short、longunsigned属于附属关键字修饰基本整数类型,其特征如下:
short int 类型(short 类型)占用的空间可能比int 类型少常用于较小数值的场合以节省空间。
long int类型(int类型)占用的存储空间可能比int多,适用于较大数值的场合。
(C99标准加入)long long int(long long)占用的存储空间可能比 long 多,适用于更大数值的场合。该类型至少占 64 位。
unsigned int(unsigned)只用于非负值的场合。这种类型是无符号数,它与有符号类型表示的范围不同。例如,16位unsigned int 允许的取值范围是 0 ~ 65535,而不是*-32768 ~ 32767*。用于表示正负号的位现在用于表示另一个二进制位,所以无符号整型可以表示更大的数。
浮点型家族:
float:单精度浮点数
double:双精度浮点数
各类整数类型对大多数软件开发项目而言够用了
_Bool类型:
二、数据的存储C99标准添加了_Bool类型,用于表示布尔值,即逻辑值true和false,所以_Bool类实际上也是一种整数类型。但原则上它仅占用1位存储空间,因为对0和1而言,1位的存储空间足够了。
1.原码、反码、补码
计算机中的有符号数有三种表示方法,即原码、反码和补码。
三种表示方式均有符号位和数值位两部分,符号位都是用0表示’正’,用1表示’负‘,而数值位三种表示方法各不相同。
原码
直接将二进制按照正负数的形式翻译成二进制,就是原码。
反码
将原码的符号位不变,其他位依次按位取反,就是反码。
补码
反码+1就得到补码。
2.整型在数据中的存储
以整型int为例子:
int a = 20;
int b = -10;
上图中可以看出:
变量a的值被定义成 20 在内存中为 14 00 00 00
变量b的值被定义成 -10 在内存中为 f6 ff ff ff
我们可以看出 14 00 00 00 是十进制数字20的十六进制,但是-10在内存中的存储方式和正整数存储的方式明显不同.
无符号整型和有符号整型的存储规则
当有符号(无符号)整型的符号位为0时,也就是说当变量是正整数的时候,他的原码 == 反码 == 补码。
当有符号整型的符号位为1时,就需要遵循计算规则进行转换。
为什么使用补码
我们通过一个简单的例子来初步了解一下:
1 + -1 = ? 方便计算我们用 内存大小8bit的char型来表述
1 :原码 = 反码 = 补码 = 0000 0001
-1:原码 = 1000 0001
:反码 = 1111 1110
:补码 = 1111 1111
*数据的计算是补码在cpu中进行的计算操作
:: 0000 0001
’+ ‘ : 1111 1111
‘=’ 1 0000 0000
这里数据发升了进位最高位的 1 被舍弃,所以结果的补码为:0000 0000
从这个例子中看出使用补码方便了计算,同时也将全0数据段定位成了’0‘
大小端概念
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。
浮点型数据的存储
常见的浮点数:
3.14159 1E10 浮点数家族包括: float、double、long double 类型。
存储规则:
根据国际标准IEEE(电子和电气工程协会)745,任意一个二进制浮点数V可以表示成下面的形式:
·(-1)^S * M * 2^E
·(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数
·M表示有效数字,大于等于1,小于2
·2^E表示指数位
举例来说:
十进制的5.0,写成二进制是 101.0 ,相当于 1.01×2^2 。 那么,按照上面V的格式,可以得出s=0, M=1.01,E=2。
十进制的-5.0,写成二进制是 -101.0 ,相当于 -1.01×2^2 。那么,s=1,M=1.01,E=2。 IEEE 754规定:
对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M。



