数据的储存1

上一篇文章通过讲解一些简单的数据储存,让大家了解到编译器中debug和release的差距。这篇文章先来进行个总结。

debug一般是程序员写代码时使用的,方便程序员的修改。

release版本基本上用于发行,它用强大的优化极大的提高了代码的执行效率和内存管理。

这篇文章就来聊一下整形 也就是int,char型在计算机内存中的存储方式

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
int main() {
	int a = -10;
	return 0;
}

按F10进入调试窗口

调试中找到窗口,点击内存,监视变量a在计算机内部的储存

 在地址中输入&a,按enter即可观察到变量a的地址,将右边的列调整为4,借此观察变量a在计算机的储存方式

 数据在计算机内是以二进制的形式存储的,对于整数来说,在计算机存储中有三种表示形式。

分别为之前文章提到的:原码,反码,补码。

这里提供一下之前写的文章:操作符详解

正整数的原码,反码,补码相同。

这里来聊一下负数,计算机内部储存是以补码来及逆行存储的

 这边以a=-10为例,一个int所占计算机为4个字节,也就是32个bit位,这里我先写一下-10的原码,然后再来解释

10000000000000000000000000001010

这段原码的第一位是符号位,当整数为正时,符号位为0,整数为负时,符号位为1。之后可通过计算器算出10的二进制序列

 为1010,所以最后思维为1010

反码就是符号位不变,其他位按位取反也就是11111111111111111111111111110101——反码

反码+1即为补码,所以10的补码为11111111111111111111111111110111

这里可以为大家解释一下在内存中存储的是补码的原因,这里我举个例子

当计算机在计算1-1的时候,cpu是不能进行加法的,所有计算机实际上是在计算1+(-1),用加法模拟减法

这是1的原码00000000000000000000000000000001

这是-1的原码10000000000000000000000000000001

当使用这两个原码相加,计算出来的结果就为10000000000000000000000000000010

换算成十进制就为-2

这是1的补码0000000000000000000000000000001

这是-1的补码11111111111111111111111111111111

两个相加即为00000000000000000000000000000000

换算出来的十进制位就是0 

这里a的二进制位是:00000000000000000000000000001010

但是细心的读者可能已经发现如果这个地址用十六进制表示就应该为0000000a

这不就是把这个十六倒着存

在知道为什么这样存储的原因前,先让读者了解一下大端存储和小端存储。

这里可以假设a的地址位0x11223344,为了方便计算机读取内存中的信息,计算机有了两种存储方式分别为

 

 这里我们需要了解计算机在内存中存储的字节序,当一个变量大于1个字节时,就会分成大端字节序和小端字节序

11 22 33 44 就为大端字节序, 44 33 22 11 就为小端字节序

大端字节序:11 22 33 44中44就是这个十六进制的低位,这里举个例子,十进制中123,3就是低位,1就是高位,假设左边是低地址,右边是高地址。将低位字节序放在高地址中,高位字节序存放在低地址处

小端字节序:高位字节序放在高地址处,低位字节序放在低位处

这里我们也可以看出,我们的a=-10这个变量在我们现在的编译器中是小端存储的

那么这里我们能否通过设计一个小程序来测量计算机是大端存储还是小端存储呢?

这个留着下一篇文章讲解 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值