C语言中数据在内存如何存储——数据类型

数据类型

【知识点】

  1. 数据类型
  2. 整型
  3. 字符型
  4. 实数(浮点型)型

【内容】

一、数据类型

C语言要求在定义所有的变量时都要指定变量的类型。常量也是区分类型的。

在数学中,数值是不分类型的,数值的运算是绝对准确的,例如:78与97之和为175,1/3的值是0.33333...(循环小数)。数学是一门研究抽象的学科,数和数的运算都是抽象的。

而在计算机中,数据是存放在存储单元中的,它是具体存在的。而且存储单元是由有限的字节构成的,每一个存储单元中存放数据的范围是有限的,不可能存放“无穷大”的数,也不能存放循环小数。例如用C程序计算和输出1/3:

printf("%f",1/3.0);

得到的结果是0.333333,只能得到6位小数,而不是无穷位小数。

结论:用计算机进行的计算不是抽象的理论值的计算,而是用工程的方法实现的计算,在许多情况下只能得到近似的结果。

 

所谓类型,就是对数据分配存储单元的安排,包括存储单元的长度(占多少字节)以及数据的存储形式。不同的类型分配不同的长度和存储形式。

数据类型的分类:(带*表示C99添加)

  1. 基本类型
    1. 整型类型
      1. 短整型(short [int])
      2. 基本整型(int)
      3. 长整型(long [int])
      4. *双长整类型(long long [int])
      5. *布尔型(bool)
    2. 实数(浮点)类型
      1. 单精度浮点型(float) 占4个字节,有效数为6位
      2. 双精度浮点型(double) 占8个字节 有效数为15位
      3. *长双精度浮点型(long double)
    3. 字符类型(char) 占1个字节
  2. 枚举类型(enum)
  3. 空类型(void)
  4. 派生类型(5)
    1. 指针类型(*)
    2. 数组类型([])
    3. 结构体类型(struct)
    4. 共用体类型(union)
    5. 函数类型

在C语言之中没有字符串变量,字符串使用字符数组表示。C语言中对数据类型没有设定默认值。

 

二、整型数据

整型数据在存储单元中的存储方式是:以二进制补码形式存储。一个正数的补码,是该数的二进制形式。一个负数的补码,是该负数的绝对值的原码取反加1的形式。

例如:-5的补码

C语言中数据在内存如何存储——数据类型_第1张图片

在存放整数的存储单元中,最左面一位是用来表示符号的。如果该位为0,表示数值为正。如果该位为1,表示数值为负。

如果给整型变量分配2个字节,则存储单元中能存放的最大值为01111111 11111111,最小值为10000000 00000000。超过此范围,就会出现数值的“溢出”。

  1. 基本整型(int)
  2. 短整型(short [int])
  3. 长整型(long [int])
  4. 双长整型(long long [int])

注意:C标准没有具体规定各种数据类型所占用存储单元的长度。这是由各编译系统自行决定的。C标准只要求long型数据长度不短于int型,short型不长于int型。即:

sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

sizeof是测量类型或变量长度的运算符。

 

整型变量的符号属性

C语言中数据在内存如何存储——数据类型_第2张图片

  1. 基本整型
    1. 有符号基本整型:[signed] int
    2. 无符号基本整型: unsigned int
  2. 短整型
    1. 有符号短整型: [signed] short [int]
    2. 无符号短整型: unsigned short [int]
  3. 长整型
    1. 有符号长整型: [signed] long [int]
    2. 无符号长整型: unsigned long [int]
  4. 双长整型
    1. 有符号双长整型: [signed] long long [int]
    2. 无符号双长整型: unsigned long long [int]

注:在整型数据中,如果既未指定signed也未指定unsigned,默认为“有符号类型”。

有符号整型数据存储单元中最高位代表符号(0为正,1为负)位。没有符号整型数据存储单元中,全部的二进位都用作存放数值本身。

C语言中数据在内存如何存储——数据类型_第3张图片

注:

  1. 只有整型、字符型数据可以加signed或unsigned修饰符,实型数据不能加。
  2. 对无符号整型数据用“%u”格式输出。%u表示用无符号十进制数的格式输出。

【思考题】:

C语言中数据在内存如何存储——数据类型_第4张图片

得到的结果为len = 65535

原因是:系统对-1先转换成补码形式,如下图

由于len变量是无符号类型,所以存储单元中的第一位作为数值位存放数值。所以按“%u”格式输出结果是:len = 65535

结论:整型数据不管有无符号,在计算机内存储方式都是以二进制补码形式存储。

 

三、字符型数据

目前大多数系统采用ASCII字符集,各种字符集(包括ASCII字符集)的基本集都包括了127个字符。所有127个字符都可以用7个二进位表示(ASCII码值为127时,二进制形式为1111111,7位全1)。所以在C中,指定1个字节(8位)存储一个字符(所有系统都不例外)。此时,字节中的第1位置为0。

字符变量实际上是一个字节的整型变量,由于它常存放字符,所以称为字符变量。可以把0-127之间的整数赋给一个字符变量。

在输出字符变量时,可以选择以十进制整数形式输出,或以字符形式输出。如:

C语言中数据在内存如何存储——数据类型_第5张图片

字符变量的符号属性

说明:在使用有符号字符型变量时,允许存储的值为-128—127,但字符的代码不可能为负值,所以在存储字符时实际上只用到0—127这一部分,其第1位都是0。

如果将一个负整数赋给有符号字符型变量是合法的,此时它不代表一个字符,而作为一字节整型变量存储负整数。如:

signed char ch = -6;

如果在定义变量时既不加signed,又不加unsigned,C标准并未规定是按signed char处理还是按unsigned char处理,由各编译系统自己决定。

 

四、浮点型数据

在C语言中,实数是以规范化的二进制指数形式存放在存储单元中的。

规范化二进制指数形式:小数点前为0,小数点后第1位不为0的表示形式。(也就是尾数大于等于0.1小于1)

浮点数类型:单精度浮点型(float)、双精度浮点型(double)、长双精度浮点型(long double)

float型(单精度浮点型)

编译系统为每一个float型变量分配4个字节,数值以规范化的二进制数指数形式存放在存储单元中。在存储时,系统将实型数据分成小数部分和指数部分两个部分,分别存放。

在4个字节(32位)中,究竟用多少位来表示小数部分,多少位来表示指数部分,C标准并无具体规定,由各C语言编译系统自定。

由于用二进制形式表示一个实数以及存储单元的长度是有限的,因此不可能得到完全精确的值,只能存储成有限的精确度。小数部分占的位(bit)数愈多,数的有效数字愈多,精度也就愈高。指数部分占的位数愈多,则能表示的数值范围愈大。

float型数据能得到6位有效数字,精度误差在1e-6。

double型(双精度浮点型)

用8个字节存储一个double型数据,可以得到15位有效数字,精度误差在1e-15。在C语言中进行浮点数的算术运算时,系统将float型数据都自动转换为double型,然后进行运算。

long double型(长双精度浮点型)

不同的编译系统对long double型的处理方法不同。

C语言中数据在内存如何存储——数据类型_第6张图片

 

 

五、怎样确定常量的类型

在C语言中,不仅变量有类型,常量也有类型。

在程序中出现的常量是要存放在计算机中的存储单元中的。这就必须确定分配给它多少字节,按什么方式存储。

怎样确定常量的类型?

从常量的表示形式即可判定其类型。

整型常量:不带小数点的数值是整型常量,但应注意其有效范围。在一个整数的末尾加大写字母L或小写字母l,表示它是长整型(long int)。

整型常量以二进制补码形式存储在计算机的存储单元中。

浮点型常量:小数形式或指数形式的实数。在C语言编译系统中将浮点型常量按双精度浮点型处理。(C程序中的浮点型常量都是双精度浮点型常量)

浮点型常量以规范化的二进制指数形式存储在计算机存储单元中。

可以在常量的末尾加专用字符,强制指定常量的类型。

  1. 在常量后面加F或f表示是float型;
  2. 在实型常量后面加L或l表示long double型;

有道云笔记详情:数据在内存中如何存储

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(C语言学习,C语言数据类型)