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

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

总结

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


相关文章
|
22天前
|
C语言
【C语言】原码、反码、补码详解 -《码上有道 ! 》
在计算机科学中,整数的表示方式有多种,包括原码、反码和补码。这些表示方式主要用于解决整数的二进制表示和计算问题。本文将详细介绍这三种表示方法,并通过示例来说明它们的原理和应用,特别是它们在C语言中的应用。
91 5
|
6月前
|
C语言
指针进阶(C语言终)
指针进阶(C语言终)
|
6月前
|
数据库 C语言
C语言进阶 文件操作知识(上)
C语言进阶 文件操作知识(上)
42 3
|
6月前
|
存储 C语言
C语言进阶 文件操作知识(下)
C语言进阶 文件操作知识(下)
43 2
|
6月前
|
存储 编译器 数据库
【再识C进阶5(上)】详细介绍C语言文件操作——文件是用于存储数据
【再识C进阶5(上)】详细介绍C语言文件操作——文件是用于存储数据
|
7月前
|
编译器 C语言 C++
从C语言到C++_21(模板进阶+array)+相关笔试题(下)
从C语言到C++_21(模板进阶+array)+相关笔试题
54 2
|
6月前
|
Java 程序员 Linux
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
58 0
|
7月前
|
C语言
万字详解:C语言三子棋进阶 + N子棋递归动态判断输赢(二)
我们可以通过创建并定义符号常量NUMBER,来作为判断是否胜利的标准。如三子棋中,令NUMBER为3,则这八个方向中有任意一个方向达成3子连珠,则连珠的这个棋子所代表的玩家获胜。
84 1
|
7月前
|
算法 C语言 C++
万字详解:C语言三子棋进阶 + N子棋递归动态判断输赢(一)
三子棋游戏设计的核心是对二维数组的把握和运用。
98 1
|
6月前
|
存储 C语言
【C语言进阶篇】整数在内存的存储——原码、反码、补码
【C语言进阶篇】整数在内存的存储——原码、反码、补码