C语言进阶(反码和补码)

简介: C语言进阶(反码和补码)

前言

本篇文章我们主要来讲解C语言中的反码和补码,这个可能是大家比较容易忽略的点,那么这篇文章就带大家来学习一下什么是反码和补码。

一、反码

反码是通过对整数的二进制表示取反得到的。

如果一个二进制数是正数,那么它的反码与原码相同。

如果一个二进制数是负数,那么它的反码是将原码中的所有位取反(0 变为 1,1 变为 0)得到的。

例如:

原码表示的数值为 5:00000101,其反码与原码相同:00000101。

原码表示的数值为 -5:10000101,其反码是将原码中的所有位取反:11111010。

反码的缺点是存在两个零的表示:一个全零(00000000)和一个全一(11111111)。这会导致在进行某些运算时可能出现问题。

二、补码

补码是在反码的基础上再加上 1,得到的结果即为补码。

补码表示的数值与原码相同。

补码的优点在于它消除了反码的两个零的表示问题,只有一个零的表示,同时也提供了更方便的计算方式。大多数现代计算机系统使用补码来表示有符号整数。

例如:

原码表示的数值为 5:00000101,其补码与原码相同:00000101。

原码表示的数值为 -5:10000101,其补码是将反码加 1:10000110。

补码具有很多有用的性质,例如对于加法运算,使用补码可以直接进行二进制的加法,并且不需要额外的处理。

三、符号位

符号位是在有符号数的二进制表示中用来表示数值的正负的一位。

在二进制数中,最高位是用来表示符号位的。通常约定:0 表示正数,1 表示负数。

符号位的存在可以让我们在使用二进制数进行数值计算时,能够区分出正数和负数,从而正确地执行各种算术和逻辑运算。

例如,对于一个 8 位的有符号数,如果最高位为 0,则表示一个正数,而如果最高位为 1,则表示一个负数。

举例:

需要注意的是,符号位只用于表示数值的正负,而不参与具体的运算。当进行算术运算时,需要考虑符号位的特殊处理,如补码运算中须注意溢出。

符号位是有符号整数的二进制表示中一个重要的组成部分,它提供了对数值的符号信息,在计算和操作有符号数时具有特殊的意义。

四、在程序中打印反码和补码

#include <stdio.h>
void printBinary(int n, int numBits) {
    for (int i = numBits - 1; i >= 0; i--) {
        int bit = (n >> i) & 1;
        printf("%d", bit);
    }
    printf("\n");
}
int main() {
    int num = -5;
    // 反码
    int negation = ~num;
    printf("Negative of %d (in binary): ", num);
    printBinary(negation, sizeof(num) * 8);
    // 补码
    int complement = ~num + 1;
    printf("Two's complement of %d (in binary): ", num);
    printBinary(complement, sizeof(num) * 8);
    return 0;
}

在这个示例程序中,num 被定义为 -5。然后,我们使用位反转操作符(~)和加法运算来计算反码和补码。

函数 printBinary 被定义用于打印二进制表示形式。它从给定的数值 n 的最高位开始迭代,提取每一位的值,并打印出来。

运行这个程序将输出:

Negative of -5 (in binary): 11111111111111111111111111111010
Two's complement of -5 (in binary): 11111111111111111111111111111011

通过使用上述的技巧,你可以在程序中打印给定数值的反码和补码。根据需要,可以调整程序中的数值,并自定义二进制打印的位数。

总结

本篇文章主要给大家讲解了反码和补码的原理,以及如何在程序中打印出反码和补码,大家看完后好好总结学习。


相关文章
|
3天前
|
编译器 C语言
C语言进阶⑯(自定义类型)项目:静态通讯录,增删查改排序打印。
C语言进阶⑯(自定义类型)项目:静态通讯录,增删查改排序打印。
13 1
|
3天前
|
存储 C语言
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)(下)
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)
10 0
|
1天前
|
存储 开发框架 编译器
C语言进阶—自定义类型:结构体,枚举,联合
C语言进阶—自定义类型:结构体,枚举,联合
|
1天前
|
存储 C语言 C++
C语言进阶——指针
C语言进阶——指针
|
1天前
|
存储 小程序 编译器
C语言进阶—深度剖析数据在内存中的存储
C语言进阶—深度剖析数据在内存中的存储
|
3天前
|
C语言
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)(下)
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)
8 0
|
3天前
|
C语言
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)(上)
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)
12 0
|
3天前
|
自然语言处理 编译器 Linux
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)(下)
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)
6 0
|
3天前
|
程序员 编译器 C语言
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)(中)
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)
13 0
|
3天前
|
存储 程序员 编译器
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)(上)
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)
13 0