C++负数的二进制表示的计算

本文详细解释了8位二进制数如何表示正数与负数,并介绍了补码的计算方法。通过实例演示,帮助读者掌握不同数值在计算机中的表示方式。
 首先,我们看一下这个数轴,8位二进制表示数值型数据,它应该是落在0~256(不含 256)区间上,当这个数落在0~128(不含128)区间上时,我们说它是一个正数,至于正多少取决于这个数从0点往右走了多少。如:+33对应的二进制是00010001   如果这个数落在后半轴上,也就是128~256(不含256)区间上时,我们说它是一个负数,至于负多少取决于它离终点256还差多少。如:156表示就不再是+156,而是表示-100,二进制编码为:10011100  
 稍微细心的朋友可能会发现,凡是落在后半轴的数,也就是负数,都有一个共同点,那就是这个数第1位二进制编码一定是1,而落在前半轴的数第1位一定是0,这样就造成很多人误认为1就是仅仅简单的表示负号,而0表示正号,这是不科学的。但反过来说是可以的:负数的最高位一定是1,正数的最高位一定是0   
可能有朋友会问了,156表示不是+156,那+156该怎么表示呢,它的二进制编码又是多少呢?   
在这里我要强调一下,我们现在是假设只用1个字节(也是8位二进制)来表示带符号的整数,那么它能表示的数的范围只能是          -128 ~ +127之间,156是表示不下的,明白吗。要想表示156,就不能用1个字节去表示该整数,可以用2个字节的short或者4个字节的int类型。因为1个字节的char类型能表达数值的范围只能是 -128 ~ +127之间。
若是输出这个被赋予156值的char类型的字符变量,是会直接显示出一个负数,不需要进行最高字符位是否为1的判断。
 
好的,到这里相信各位基本了解了负数的表示原理了,在这里我还想沟通一下求负数表示的另外一种方法,这就是很多书上提到的采用补码的方法 (负数的绝对值的二进制位按位取反,再加1)  
要求一个负数的二进制表示方式,可以先求出它的原码(即负数的绝对值的二进制位),然后每位取反得出它的反码,反码再加1得出补码   
如:
假设还是以8位二进制来表示带符号的整数(如果是short类型,int类型等,他们都有自己的数值范围)   
-56的原码是:00111000   那么它的反码是:11000111   补码为:11000111+1=11001000   
得出,-56在计算机内部是用11001000这串二进制来表示的
C++ 中,`int` 类型数值的二进制表示通常依赖于其存储方式,即使用补码形式表示负数[^3]。为了获取一个 `int` 类型数值的二进制表示,可以使用位操作来逐位提取每一位的值,并将其转换为字符串形式输出。 以下是一个 C++ 实现,用于将 `int` 类型数值转换为二进制字符串表示: ```cpp #include <iostream> #include <bitset> #include <string> std::string intToBinary(int num) { // 使用 bitset 将整数转换为 32 位的二进制字符串 std::bitset<32> binary(num); return binary.to_string(); } int main() { int num; std::cout << "Enter an integer: "; std::cin >> num; std::string binaryStr = intToBinary(num); std::cout << "Binary representation: " << binaryStr << std::endl; return 0; } ``` ### 代码说明: 1. **`std::bitset<32>`**:C++ 标准库中的 `bitset` 可以将整数转换为固定长度的二进制字符串。由于 `int` 类型通常是 32 位,因此使用 `bitset<32>` 来存储其二进制表示。 2. **`binary.to_string()`**:将 `bitset` 对象转换为字符串形式,输出完整的二进制表示,包括前导零。 3. **负数处理**:由于 `bitset` 会自动处理补码表示,因此对于负数也能正确输出其二进制形式[^2]。 ### 示例输出: 如果输入 `-5`,程序将输出类似以下内容: ``` Binary representation: 11111111111111111111111111111011 ``` 如果输入 `5`,程序将输出: ``` Binary representation: 00000000000000000000000000000101 ``` ### 手动实现方式: 如果希望不使用 `bitset`,也可以通过位运算手动提取每一位的值: ```cpp #include <iostream> #include <string> std::string intToBinaryManual(int num) { std::string binaryStr = ""; for (int i = 31; i >= 0; --i) { // 提取最高位到最低位 int bit = (num >> i) & 1; binaryStr += std::to_string(bit); } return binaryStr; } int main() { int num; std::cout << "Enter an integer: "; std::cin >> num; std::string binaryStr = intToBinaryManual(num); std::cout << "Binary representation: " << binaryStr << std::endl; return 0; } ``` ### 代码逻辑: 1. **`num >> i`**:将整数右移 `i` 位,以便提取指定位的值。 2. **`& 1`**:通过按位与操作提取当前位的值。 3. **循环从高位到低位**:确保输出完整的 32 位表示。 ### 特点: - 手动实现方式可以更直观地理解二进制转换的过程。 - 对于需要定制化输出格式(例如不包含前导零)的情况,可以进一步优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值