C语言基础内存区,原码反码补码

C内存:
    栈:局部变量、函数形参 由编译器管理(函数结束,内存释放)
    堆: malloc 开辟空间 free 释放空间 由程序员管理
    全局区/静态存储区: 全局变量和静态变量   编译器管理: 程序结束,内存释放
    常量区:存储常量  编译器管理
    代码区:存放编写的代码  编译器管理


一般全局静态区和常量区都是放在一起的

----------

bit 比特
byte 字节 = 8bit
word = 4 byte

---------

计算机里面的计算都是用反码来计算的
原码
最高位作为符号位 (0代表正 1代表负)
7    0000 0111        -7    1000 0111
127    0111 1111        -127    1111 1111
反码
如果为正 与原码相同 。 如果为负 ,符号位为1,其他与原码相反
7    0000 0111        -7    1111 1000
补码
正数 原码 反码 补码 都一样
负数: 反码 +1
7    0000 0111        -7    1111 1001
使用反码求原数据,如上面 -7 除符号位其他各位求反  1000 0110 再加1 就得到了原数据

计算机内正负数都是用补码来计算的

如上图我输出的是十六进制的-10,实际上输出的是-10的反码
-10 原码 1000  0000 0000 0000 0000 0000 0000 0000 1010
      反码  1111 1111 1111 1111 1111 1111 1111 1111 0101
      补码  1111 1111 1111 1111 1111 1111 1111 1111 0110
                 f        f        f         f      f        f        f        f        6
如果是+10的话 就是正常输出  10的16进制为 a



### C语言中实现数字原码反码补码转换方法 #### 定义概念 在计算机科学里,整数以二进制形式存储于内存之中。对于有符号整数而言,其编码方式分为三种:原码反码以及补码[^2]。 - **原码** 是指一个数值最直观的二进制表达形式,在这种表示下,正数的符号位为`0`而负数则为`1`,剩余部分则是该数值绝对值得到的标准二进制序列[^4]。 - **反码** 的作用在于解决加减运算过程中遇到的问题,它通过对除符号位外其他各位求反来获得。具体来说,正数的反码原码一致;而对于负数,则需将其非符号位全部翻转得到反码[^3]。 - **补码** 主要是用来优化算术逻辑单元(ALU)的设计并提高效率的一种机制。正数情况下,补码等于自身的原码;但对于负数来讲,先取得对应正数的反码之后再加上一即得其补码[^1]。 #### 编写函数实现转换过程 下面给出一段简单的C程序用于演示如何获取给定整型变量对应的这三种不同类型的机器码: ```c #include <stdio.h> #define BIT_WIDTH 8 // 设定位宽,这里设为一字节长度 void showBinary(int num){ int i; unsigned mask = 1 << (BIT_WIDTH - 1); printf("binary:"); for(i = 0; i < BIT_WIDTH ; ++i){ putchar((num & mask)? '1' : '0'); num <<= 1; if ((i % 4)==3 && i != BIT_WIDTH-1 ) putchar(' '); } } // 获取指定整数n的原码字符串表示 char* getOriginalCode(int n){ static char buffer[9]; // 静态数组保存结果 sprintf(buffer,"%d",abs(n)); return buffer; } // 计算某整数n的反码 int calculateReverseCode(int n){ if(n >= 0) return n; int result = ~(-n); // 对应位置取反操作 return result; } // 得到某个整数n的补码 int getComplementCode(int n){ if(n>=0) return n; return (~calculateReverseCode(abs(n))) + 1 ; } ``` 上述代码片段定义了一些辅助性的功能以便更好地理解和展示这些编码之间的关系。其中 `showBinary()` 函数负责将以十进制输入的数据按照设定好的宽度输出成相应的二进制串;`getOriginalCode()`, `calculateReverseCode()`, 和 `getComplementCode()` 则分别实现了对任意整数参数执行原码反码补码变换的功能[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值