C++浅析数据在内存中如何存储_第1页
C++浅析数据在内存中如何存储_第2页
C++浅析数据在内存中如何存储_第3页
C++浅析数据在内存中如何存储_第4页
C++浅析数据在内存中如何存储_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论