版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第C++浅析数据在内存中如何存储目录一、数据类型二、原码反码补码三、大小端整型提升
一、数据类型
数据类型有7种:
char字符型
short短整型
int整型
long长整型
longlong更长整型
float单精度浮点数
double双精度浮点数
二、原码反码补码
计算机中的整数有三种2进制表示方法,即原码、反码和补码。
三种表示方法均有符号位和数值位两部分,符号位都是用0表示正,用1表示负,而数值位正数的原、反、补码都相同。
负整数的三种表示方法各不相同.
原码:是直接将数值按照正负数的形式翻译成二进制得到原码。
反码:原码的符号位不变,其他位依次按位取反得到反码。
补码:反码加1,得到补码。
计算例子:如图
计算a+b:
a是正数,原码等于补码:00000000000000000000000000000111
b是负数,原码:10000000000000000000000000001010
反码:111111111111111111111111111110101
补码:11111111111111111111111111110110
a+b的补码分别相加得到:11111111111111111111111111111101
而打印的是%d即有符号整型,要把它转化为原码,减一取反的到原码:
10000000000000000000000000000011再化为10进制就是-3
看下运行结果:
三、大小端
数据在内存中有两种存储方式一个是大端模式一个是小端模式。
在计算机系统中,以字节为单位的,每个地址单元对应着一个字节,一个字节为8bit。但在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于奇存器宽度大于一个字节,那么心然存在着一个如何将多个字节安排的问题。这导致了大端存储模式和小端存储模式。
我们如何判断当前机器的字节顺序:
#includestdio.h
intis_sys()
inta=1;
return(*(char*)
intmain()
intret=is_sys();
if(ret==1)
printf("小端\n");
else
printf("大端\n");
return0;
取一个整型数1,补码:000000000000000000000000000001,要判断它哪种存储模式,只需要拿出第一个字节,因为低位放在高地址处时是大端,低位放在低地址处时小端,取地址先转化为字符型指针保证拿出一个字节,再解引用取出内容,如果是1就是小端,反之是大端。
整型提升
C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型。
我们用字符类型存储数据会发生截断,因为一个数是四个字节,字符型只能存储一个字节,截断之后看当前符号位:
对于有符号类型,如果是1就把1之前的位补全1进行整型提升,如果是0就把0之前的位补全0进行整型提升。
对于无符号类型,直接补全0.
(1)我们看如下例子就能很好理解:
#includestdio.h
intmain()
chara=-2;
unsignedcharb=-10;
printf("%d%d",a,b);
a=-2,原码:1000000000000000000000000000010
反码:11111111111111111111111111111101
补码:11111111111111111111111111111110
但是a是字符型只能存一个字节,会发生截断只取低位的一个字节即:11111110
而我们打印的是有符号整型%d,会发生整型提升,因为它是负的,所以在前面补1
11111111111111111111111111111110,而打印的是原码,所以再转换为原码。减一取反:10000000000000000000000000000010结果是-2
b=-10,原码:10000000000000000000000000001010
反码:11111111111111111111111111110101
补码:11111111111111111111111111110110
同上截断之后:11110110因为他是无符号整型在前面补0:
00000000000000000000000011110110.直接是原码打印结果是246.
再验证下结果:
(2)另外%u是打印无符号整型。也是被截断之后看原来的数是否有符号,如果有符号不补1或补0,无符号直接补0.然后补完之后直接当做原码打印
例如char=-128
原码:10000000000000000000000010000000
反码:11111111111111111111111101111111
补码:11111111111111111111111110000000
因为是字符型拿低位的一个字节1000000,又因为他是负数补1:
11111111111111111111111110000000,直接当原码打印因数太大直接看结果:
(3)再来分析一个:
#includestdio.h
intmain()
inti=-20;
unsignedcharj=10;
unsignedcharb=i+j;
printf("%u",b);
i的原码:10000000000000000000000000010100;
反码:1111111111111111111111111101011
补码:11111111111111111111111111101100
而j是无整形且字符型值因为它是正数,原码等于补码:
00000000000000000000000000001010
两者
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 浙江临安农村商业银行股份有限公司2027届校园招聘笔试参考题库及答案解析
- 2026年湖北省宜昌市公务员人员招聘考试参考试题与答案详解
- 某水泥厂节能降耗规范
- 2026四川内江经开区就业和社会保障服务中心招聘见习人员1人笔试参考题库及答案解析
- 2026山东淄博职业技术大学高层次人才招聘13人(第二批)考试备考题库及答案解析
- 2026年福建省五建建设集团有限公司招聘第二批工作人员9人考试模拟试题及答案解析
- 2026年芜湖智能传感器研究院有限公司专业技术人才招聘部分岗位补招笔试模拟试题及答案解析
- 2026年浙江省台州市公务员人员招聘笔试参考试题与答案详解
- 2026宁电投(石嘴山市)能源发展有限公司秋季招聘30人考试模拟试题及答案解析
- 2026重庆水利电力职业技术学院考核招聘事业单位人员(第二批)8人考试备考试题及答案解析
- 2026客服面试题及参考答案
- 2026秋小学苏教版科学四年级上册第三单元学情测试练习卷含答案三套
- 2027贵州航天电器秋季招聘284人考试模拟试题及答案解析
- 2026年高级园林绿化工职业技能鉴定理论考试题库及答案
- 第6课 人民当家作主 第1课时 课件(内嵌视频)2026-2027学年道德与法治五年级上册统编版
- 2026年初级车险理赔试题及答案
- 光伏发电并网工程接入系统设计方案
- 《新能源汽车电工电子技术》课程标准
- 中医胆囊结石护理要点说课
- 2026中国机床检测市场投资前景研究与可持续发展规划研究报告
- 2026年医疗器械基础知识培训资料
评论
0/150
提交评论