数据类型

来源:互联网 发布:中国移动网络电视伴侣 编辑:程序博客网 时间:2024/06/06 01:56

数据类型

数据分类的意义

不同的数据类型占据不同的空间大小,数据在内存中的存储如下图所示,每个变量都有一个唯一的内存地址和与之对应的变量值。
内存中的数据

c语言提供了sizeof关键字来查看数据类型占据的内存大小,如下程序所示,演示了常用的数据类型占据的字节大小。

/*    sizeof查看常用数据类型占据内存空间大小    不同数据类型占据不同的大小,解析的方式也不一样    @author tony ittimeline@163.com    @date 2017/11/15 21:54    @website www.ittimeline.net*/void sizeof_sample() {    //整数默认为int,占据4个字节    printf("整数占据的字节数量为%d\n",sizeof(10));    char c = 'a';    //字符占据1个字节    printf("字符占据的字节数量为%d\n", sizeof(c));    //sizeof运算符将字符A自动转换为int,因此这里占据四个字节    printf("字符常量占据的字节数量为%d\n",sizeof('a'));     //浮点数默认为double,因此占据8个字节    printf("浮点数占据的字节数量为%d\n",sizeof(3.14));    //字符串默认以\0结束 因此str占据4个字节    printf("字符串str占据的字节数量为%d\n",sizeof("str"));    system("pause");}

占有的字节数量越大,存储数据的区间范围也越大,这里以整数为例,查看极限。

/*    整数的极限    @author tony ittimeline@163.com    @date 2017/11/15 21:54    @website www.ittimeline.net*/void int_limits() {    //调用limits.h头文件中定义的常量值    printf("int能存储的最大整数为%d\t能存储的最小整数值为%d\n",INT_MAX,INT_MIN);     system("pause");}

如果数据类型在参与运算时,超过了最大的存储范围,则运算结果会是一个错误的结果,如下程序所示:

unsigned char 能存储的最大整数位255,如果运算结果超过255,则发生计算错误的结果

/*    数据溢出的案例    确保数据精确计算,结果必须在其类型的存储范围之内    @author tony ittimeline@163.com    @date 2017/11/15 10:15    @website www.ittimeline.net*/char_overflow() {    //unsigned 表示无符号类型  也就是只能存储正整数 char所能存储最大的无符号整数为255    unsigned char num = 255 + 1;    printf("将字符变量num赋值为char所能存储的最大值并且再加上1的结果是%d",num); //结果为0    system("pause");    }

数据存储原理

数据在内存中的排列存储:为了寻址方便考虑

手机、PC:低位在低字节,高位在高字节。

(Unix)服务器:低位在高字节,高位在低字节。

数据在内存中是以二进制的补码存储的,而在参与运算时需要转换为原码,原码的最高位是符号位,0表示正数,1表示负数 。

以一个字节的正整数7和负数7为例,分析其在内存中的存储。它们的原码、反码和补码对应如下表所示。

7 -7 原码 00000111 反码 00000111 补码 00000111

同时可以通过VisualStudio提供的调试功能,编写一个程序,通过调试功能查看它们的内存存储,源码如下。

#include <stdio.h>#include <stdlib.h>/*    原码 反码 补码的案例    @author tony ittiemline@163.com    @date 2017/11/21 23:36    @website www.ittimeline.net*/void data_store() {    char positive = 7;    char negative = -7;    printf("正整数7的内存地址是%p\n",&positive);    printf("positive = %d \n",positive);    printf("负整数7的内存地址是%p\n", &negative);    printf("negative = %d \n", negative);    system("pause");}

程序的功能只是初始化了占用两个字节的整数变量positive和negative,通过printf函数获取变量的内存地址,通过查看内存地址对应的变量值得知,内存中存储的数据是按照二进制的补码形式存储的,如下图所示。正数的原码、反码和补码都是一样的,而负数的补码通过原码取反加1。如下应用所示

#include <stdio.h>/*        原码 反码 补码的计算方式    @author tony ittiemline@163.com    @date 2017 / 11 / 21 12:13    @website www.ittimeline.net*/void data_calc_sample() {    char ch = -17;    printf("-17的内存地址是%p\n",&ch);    printf("ch = %d\n",ch);    system("pause");    // 原码  1001 0001    // 反码  1110 1110   原码最高位不变,其他位数取反    // 补码  1110 1111  反码加1   内存中存储的结果应该是EF}

借助VisualStudio2017的调试功能查看内存也可以查看结果
内存存储
使用补码的原因在于计算方便。

原创粉丝点击