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

您所在的位置:网站首页 35的补码是什么 C语言进阶(反码和补码)

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

2024-06-29 08:02| 来源: 网络整理| 查看: 265

文章目录 前言一、反码二、补码三、符号位四、在程序中打印反码和补码总结

前言

本篇文章我们主要来讲解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 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

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

总结

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3