数据类型
来源:互联网 发布:中国移动网络电视伴侣 编辑:程序博客网 时间: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为例,分析其在内存中的存储。它们的原码、反码和补码对应如下表所示。
同时可以通过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的调试功能查看内存也可以查看结果
使用补码的原因在于计算方便。
阅读全文
0 0
- 数据类型
- 数据类型
- 数据类型
- 数据类型
- 数据类型
- 数据类型
- 数据类型
- 数据类型
- 数据类型
- 数据类型
- 数据类型
- 数据类型
- 数据类型
- 数据类型
- 数据类型
- 数据类型
- 数据类型
- 数据类型
- Linux下四款Web服务器压力测试工具(http_load、webbench、ab、siege)介绍
- php生成不重复的随机数
- redis---Redis持久化
- 破解教程 第六课 w32dasm破解实例(一)
- CentOS问题记录
- 数据类型
- u盘装了系统,被分区了怎么恢复的方法
- 数据结构-二分排序
- 我的世界开发日志5——什么是协程序
- ubuntu常用快捷键
- shell脚本语法
- Spring boot +spring mvc+shiro 登录验证demo
- VirtualBox+Centos7 安装openstack之路
- 第八周 项目一 建立顺序串的算法库