整型在内存中的存储方式

整型在内存中的存储方式

整型数据的二进制表现形式———原码、反码、补码

当整型是有符号整型时,这三种表现方法均有符号位和数值位两部分。

符号位 0 表示正

符号位1 表示负

正整数的原、反、补码相同

整型数据的存放方式

对于整型来说:数据存放内存中存放的是补码。

原因:

1.使用补码,可以统一处理符号位和数值域

2.加法和减法可以统一处理(cpu只有加法器),此外,原码和补码相互转换,其运算过程相同,不需要额外的硬件电路

整型数据的存放方式

对于整型来说:数据存放内存中存放的是补码。

对于使用补码存储的原因:

原因:

1.使用补码,可以统一处理符号位和数值域

2.加法和减法可以统一处理(cpu只有加法器),此外,原码和补码相互转换,其运算过程相同,不需要额外的硬件电路

int main()
{
    int num = 10;  //创建了一个整型变量,这时向内存申请大小为4个字节的空间进行存储
    return 0;
}

10是正整数,所以其原,反,补码相同

00000000000000000000000000001010 -- 原码

00000000000000000000000000001010 -- 反码

00000000000000000000000000001010 -- 补码

再举-1的例子

10000000 00000000 00000000 00000001 -- 原码

11111111 11111111 11111111 11111110 -- 反码 //符号位不变,其余全部取反,符号位是第一位

11111111 11111111 11111111 11111111 -- 补码 //反码的二进制位加一就是补码

接着解释原因一:

当用原码进行计算的时候,计算结果是错误的

计算 1 - 1

相当于 1 + (-1)

00000000 00000000 00000000 00000001 -- 1的原码

10000000 00000000 00000000 00000000 -- -1 的原码

原码相加

10000000 00000000 00000000 00000010 ---- 其大小为 -2

与实际结果不符

用补码进行计算 1 + (-1)

00000000 00000000 00000000 00000001 -- 1的补码

11111111 11111111 11111111 11111111 -- -1 的补码

将两数的补码相加

00000000 00000000 00000000 00000000 --- 结果为0 符合实际结果

从上述情况可见,用补码计算统一了符号位和数值位 ,非常方便。

解释原因二:

原码到补码 和 补码到原码 都可以用取反 +1得到

如图

我们用 -1 来举例子

首先是最常见的情况

从原码变到补码

原码先取反再+1得到补码

10000000 00000000 00000000 00000001 --- 原码

11111111 11111111 11111111 11111110 ---- 反码 (原码取反)

11111111 11111111 11111111 11111111 ---- 补码 (反码+1)

然后是从补码变到原码

11111111 11111111 11111111 11111111 --- 补码

10000000 00000000 00000000 00000000 ---- 补码取反

10000000 00000000 00000000 00000001 --- 补码取反后+1 得到的就是 -1 的原码

所以从原码变到补码 和 从 补码变到原码 可以用相同的步骤完成,即运算过程相同

上图中 从补码-1再取反的运算过程其实就是原本的原码变到补码的逆运算。所以这里我们不再展开描述

### 变量在内存中的存储机制 变量在计算机内存中的存储涉及多个层面的概念和技术细节。当定义一个变量时,编译器或解释器会根据该变量的数据类型为其分配特定数量的字节来保存其值。 对于基本类型的变量(如整数、浮点数),它们通常被直接存储在一个连续的地址空间内[^1]。例如,在C语言中声明`int a = 10;`,此时操作系统会在栈区为这个名为a的整形变量分配4个字节的空间,并将数值10写入这块区域。如果是在函数内部创建,则一般位于调用栈帧里;如果是全局变量则可能放置于数据段。 而对于复合型变量或是指针指向的对象来说情况就更加复杂一些。比如字符串常量可能会存在只读静态区内,动态申请的大块缓冲区往往来自堆上。特别是像MATLAB这样的高级编程环境所提供的结构体数组等自定义类型,不仅涉及到单个成员属性所占用的实际位宽计算,还需要考虑额外开销用来维护整个集合间的关系以及支持高效的随机访问特性[^3]。 另外值得注意的是,现代多线程应用程序中还存在着共享资源的问题——即不同执行路径之间能否安全地并发修改同一份实例副本?这就引入了诸如互斥锁之类的同步原语概念,同时也影响到了底层缓存一致性协议的设计思路[^2]。 ```c++ // C++ 示例展示简单变量与指针在内存布局上的差异 #include <iostream> using namespace std; struct Point { int x; int y; }; int main() { int num = 5; // 基本类型变量 double pi = 3.14; // 浮点数类型变量 cout << "Address of 'num': " << &num << endl; cout << "Sizeof(int): " << sizeof(num) << " bytes" << endl; char* strPtr = new char[7]; // 动态分配字符数组 strcpy(strPtr, "hello"); // 复制字符串到新位置 struct Point pnt{10, 20}; // 用户定义类型对象 void *ptrToPnt = (void*)&pnt;// 获取并转换成通用指针形式 delete[] strPtr; // 清理不再使用的堆内存 } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值