C语言中补码的整数运算特性

深入理解补码:C/C++底层编程与面试必备的核心基础 在计算机科学中,数据的二进制表示是理解系统底层运作的基石。原码、反码和补码是解决有符号整数表示与运算的核心编码方案。其中,补码通过统一的数学原理,将减法转化为加法,极大地简化了CPU硬件设计,提升了运算效率。这一机制对于实现高性能计算、确保数据一致性至关重要。在C/C++等系统编程语言中,整数类型默认以补码形式存储,这直接影响了位运算、类型转换和溢出处理等关键编程实践。掌握补码原理,不仅能帮助开发者规避整数溢出等隐蔽错误,还能优化涉及底层内存操作和网络协议封包的代码。本文将从补码的运算逻辑出发,结合C/C+ 阅读详情

前言

本篇博客以“SSD6-Exercise2-Data Lab: Manipulating Bits”为例,分析在对C语言中的整数采用补码(two’s-complement)编码的机器上,其整数运算的特性。


补码

定义

最常见的有符号数的计算机表示方式就是补码(two’s-complement)形式。在这个定义中,将字的最高有效位解释为负权(negative weight),我们用函数B2T(Binary to Two’s-complement的缩写,长度为 w)来表示。

如:

B2T ([0001]) = -0 + 0 + 0 + 1 = 1
B2T ([0101]) = -0 + 4 + 0 + 1 = 5
B2T ([1011]) = -8 + 0 + 2 + 1 = -5
B2T ([1111]) = -8 + 4 + 2 + 1 = -1

定理1

B2T ([11···1]) = -1

证明:假设B2T ([11···1]) 共有w位,则其值为 -2^(w-1) + 2^(w-2) + ··· + 2^0. 根据等比数列求和公式,易证该值为-1.

定理2

对于w位的补码B2T来说,其边界值Tmax与Tmin分别为:

Tmax = B2T ([01···1]) = 2^(w-1) - 1

Tmin = B2T ([10···0]) = -2^(w-1)

即有:~Tmax = Tmin


整数运算

我们先以表格的形式,宏观介绍C语言中的位级运算、逻辑运算和移位运算。

运算种类 运算符 主要说明
位级运算 |, &, ~, ^ 对应于布尔运算中的OR, AND, NOT, EXCLUSIVE-OR
逻辑运算 ||, &&, ! 对应于命题逻辑中的OR, AND, NOT
移位运算 <<, >> 分为左移与右移,右移运算包括逻辑右移与算数右移
!与~有什么区别?

注意:逻辑运算很容易和位级运算相混淆,但是它们的功能是完全不同的。

  • 逻辑运算中认为所有非零的参数都表示TRUE,而参数0表示FALSE.

  • 逻辑运算的结果为一个布尔值,而位级运算的结果依然为一个数.

  • 逻辑运算的运算符常称为与、或、非,而位级运算的运算符常称为与、或、取反、异或.

因此,!是逻辑运算中的非运算符,而~是位级运算中的取反运算符。

逻辑右移与算术右移

我们先来看左移运算<<.

对操作数x执行x<<k运算,即x向左移动k位。此运算会丢弃最高的k位,并在右端补k个0.

相应而言的右移运算>>.

对操作数x执行x>>k运算,即x向右移动k位。此运算会丢弃最低的k位,那么在左端需要补充的k个位是什么呢?

若执行逻辑右移,则补充k个0,这类似于左移运算.

若执行算术右移,则补充k个最高有效位的值。

且几乎所有的编译器/机器组合都对有符号数使用算术右移,对无符号数采用逻辑右移。


运算特性

我们通过完成这下面这10个函数,来体会补码的整数运算特性。

/* 
 * bitAnd - x&y using only ~ and | 
 *   Example: bitAnd(6, 5) = 4
 *   Legal ops: ~ |
 *   Max ops: 8
 *   Rating: 1
 */
int bitAnd(int x, int y) {
    return ;
}

/* 
 * bitOr - x|y using only ~ and & 
 *   Example: bitOr(6, 5) = 7
 *   Legal ops: ~ &
 *   Max ops: 8
 *   Rating: 1
 */
int bitOr(int x, 
C语言整数类型全解析:从short到long long的存储、范围与补码运算 本文全面解析C语言整数类型,从short到long long的存储结构、数值范围及补码运算原理。通过实际案例演示如何根据系统架构选择合适类型,避免整数溢出和隐式转换陷阱,特别强调补码设计对负数处理的精妙之处。适合开发者深入理解底层数据表示,提升代码健壮性和跨平台兼容性。 阅读详情

相关推荐

C语言中的整型数据补码:原理与应用

补码是计算机中用于表示有符号整数的一种高效方法,它简化了加法、减法等运算,并且避免了负数表示中的一些问题。通过补码,我们可以轻松处理正数和负数,并执行高效的整数运算。在C语言中,整数类型(如intshort等)都采用补码表示,而你作为开发者只需要关注数据如何存储和运算,而不必手动转换为补码。通过理解补码的工作原理,我们可以更好地掌握位运算、符号位处理和整数溢出等概念,从而写出更高效、可靠的代码!

m0_62599305的博客 1209

全志 T527_Android13 编译 [ 避坑必看 ]

Swap 概念: Linux中Swap(即:交换分区),类似于Windows的虚拟内存,就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况。它的功能就是在内存不够的情况下,操作系统先把内存中暂时不用的数据,存到硬盘的交换空间,腾出内存来让别的程序运行。当输入编译命令make -j16 的时候,会有如下提示,这是官方建议通过减少编译线程来解决编译时消耗内存过大的问题。Android 13 系统的编译流程,编译一共分为两部分:内核编译与 Android 编译。

公众号:嵌入式分享 2111

2026年9月20日 2026年CSP-S初赛真题整理

这是本次考试最难的部分,涉及Gray Code(格雷码)+ 状态压缩 + 数学推导难点解决方案关键代码问题转化将得分差转化为m−2xim - 2x[i]m−2xi高效枚举Gray Code相邻状态O(1)转移奇偶判断利用奇偶性统一条件。

weixin_51184047的博客 625

亚马逊SP-API授权实战:从OAuth流程到Refresh Token获取

本文详细解析了亚马逊SP-API授权流程,从OAuth认证到Refresh Token获取的全过程。通过实战经验分享,帮助开发者快速掌握Marketplace Appstore、Website Workflow和自行授权三种方式,解决常见错误如MD5100和MD9999,并提供了安全存储Refresh Token的最佳实践。

weixin_30379531的博客 518

20道SpringSecurity常见面试题汇总(超详细回答 !!!)

本文中,我们将探讨一些与 Spring Security 相关的面试问题。Spring Security 是一款流行的 Java 应用程序安全框架,它提供了一套全面且易于使用的安全解决方案。

小斜同学的博客 3076

STM32CubeMX的正交编码器encoder

由于最近干活遇到需要获取正交编码的功能,所以返回来研究一下STM32CubeMX的编码器功能,之前也更新过STM32的定时器功能,但是因为之前搞平衡车的正交编码器没有搞清楚原理,就直接用了脉冲输入功能草草了事,现在也算是为之前的年轻买单了,不过看到现有的Encoder说明都比较简单,所以就当是为开发者做贡献了,我研究清楚之后来一篇博客。

ASWaterbenben的博客 1万+

C#上位机开发入门:从基础到进阶的全方位指南

C#作为一门现代化编程语言,具备强大的功能和广泛的生态支持,适合用于开发各种类型的上位机应用。通过学习并掌握UI开发、通信协议、多线程编程、数据库操作等技能,你可以打造出稳定、易用、性能优异的上位机软件。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 8311

从DDPM到DDIM:深入解读《Denoising Diffusion Implicit Models》

DDIM发表在ICRL2021上,是DDPM重要的改进之一,能显著提高DDPM的样本质量、减少采样时间,并且能显式控制插值,已经被广泛应用到现在的Diffusion Models上。这篇博客和大家一起详细解读一下DDIM,认识这一伟大的模型。.........

沉迷单车的追风少年 1万+

10、边缘智能学习技术解析

本文深入解析了边缘智能学习技术的四大核心方法:联邦学习、DNN拆分、迁移学习和八卦学习。文章从人类大脑的学习机制出发,引出边缘级智能的重要性,并详细阐述各类技术的架构、优势、挑战及适用场景。通过对比分析,展示了不同技术在隐私性、效率、可扩展性等方面的特性,并探讨了未来融合多种技术、软硬件协同优化及应用领域拓展的发展趋势,为边缘智能在物联网与人工智能领域的应用提供了系统性参考。

ppp33的博客 117

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: C语言中const的详细用法及声明规则
下一篇: An Enhanced Allocator——为C语言的动态内存分配添加出错预警
RMSnow
博客等级 码龄10年 22粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值