学习按位取反时,一直不是很理解,为啥对0取反就是-1,对76取反就是-77,网上有说记住x+(~x)=-1就可以了,可还是有点难懂。所以我来解释一波为啥对0取反就是-1

  1. 十进制数 0 的十六进制表示为 0000 0000
  2. 对其~(取反)后得到 1111 1111
  3. 此时这个值转化为十进制就是255
  4. 此时 255-256=-1

同理 76 的十六进制为 0100 1100,取反后为1011 0011,转为十进制数为179,179-256= -77

这里其实就是有符号数的转化,在8位的范围内(0~255),最大值就只能到255。
当然,对于16位、32位数也适用,大家可以试一试。

扩展知识点

——无符号数中的负数怎么表示

无符号的8位数值中,由于不能为负值,所以-1实际上不能以-1的形式存在(很绕但确实是这样的),实际你看到的显示出来的数值为255,这是为啥呢?
例如下面这样:

#include <stdio.h>
typedef unsigned char U8;//8位无符号数,范围0~255int main(void)
{U8 u8_num=-1;print("%d\n",u8_num);return 0;
}

结果是

255

我们定义了一个8位的无符号数值,所以它的范围是0~255,-1不在这个范围内,所以此时它如何显示?这涉及到负数在计算机中的表示了。

我们知道,在计算机系统中数据都是以补码形式存储的,只不过正数的补码等于反码又等于原码。而负数的补码等于对原码取反加1

那我们求一下-1的补码(8位数值)
原码:1000 0001,(最高位为符号位,为1代表负数,为0代表正数)

反码:1111 1110,(符号位不变,其他位按位取反)

补码:1111 1111,(反码 + 1)

我们看这个补码是不是很熟悉??
没错,这个-1的补码也就是我们无符号数255的原码和补码;

正数的补码等于其本身

这里就有一个疑问,数值的原码首位不是符号位吗?为啥1111 1111却可以表示为正数255呢?

如果你的变量是8位的带符号的数,那么最高位第7位作为符号位用,最高位为0时表示是正数,为1时表示是负数;而无符号数是相对于有符号数而言的,指的是整个机器字长的全部二进制位均表示数值位,相当于数的绝对值。

也就是说无符号数没有符号位,符号位是有符号数玩的把戏。
在无符号数中,1111 1111是255,但在有符号数中,1111 1111就是-1的补码。

所以我们原本是想在一个无符号数中表示一个有符号数(-1),这是不现实的,但最终计算机妥协了,不过是以无符号数的形式(255)表现出来的有符号数(-1)。

关于补码,下面的介绍可以帮助大家了解更详细一点。本文就说这么多吧。

正数的原码=反码=补码。引进补码的作用是为了让计算机更方便做减法。
例如:按时间12个小时来算,现在的准确时间是4点,有一个表显示的是7点,如果要校准时间,我们可以将时针退7-4=3格,也可以向前拨12-3=9格,计算机做减法就可以使-3转化为+9,这样可以简化计算机的硬件设备去做复杂的减法。
所以补码反码就是为了简化减法而来的,将减号化为负数,再将负数化为补码求加法,跟正数没关系。所以不管是正整数还是正小数,原码,反码,补码都全部相同。1

参考文献:


  1. https://zhidao.baidu.com/question/2208490602456362988.html ↩︎

C语言按位取反~的简单理解相关推荐

  1. 对于C语言函数递归的简单理解(新手入门必看!!!)

    什么是函数递归? 程序调用自身的编程技巧称为递归(recursion). 递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接 调用自身的 一种方法,它通常把一个大型 ...

  2. c语言理解参数,c语言中对可变参数列表的简单理解

    函数原型中一般情况下参数的数目是固定的,但是如果想在不同的时候接收不定数目的参数时该怎么办呢?c语言提供了可变参数列表来实现. 可变参数列表是通过宏来实现的,这些宏定义在stdarg.h的头文件中.头 ...

  3. 关于C语言函数的简单理解

    关于C语言函数的简单理解 C语言中的函数 在C语言中,函数是构成程序的基本模块.程序的执行从main()函数的入口开始,到main()函数的出口结束,中间循环.往复.迭代的调用一个有一个函数.每个函数 ...

  4. python语言的计算生态规模有多大_【单选题】Python 语言的一个重要特点是它有较多的计算生态,简单理解为第三方提供的可用编程模块 / 函数库 / 组件,这个规模有多大?...

    [单选题]Python 语言的一个重要特点是它有较多的计算生态,简单理解为第三方提供的可用编程模块 / 函数库 / 组件,这个规模有多大? 更多相关问题 [问答题,简答题] 顾客关系管理系统如何给企业 ...

  5. 最简单理解并实现斐波那契数列函数(c语言)

    实现斐波那契数列数列函数前我们要知道它是什么? 最简单理解就是一个数列为:0 1 1 2 3 5 8 13 21...... 第一个数为0第二个数为1,之后的每个数为前面两个数的的和(是不是很简单呢) ...

  6. 我对XCode Objective-c Cocoa的简单理解

    我对XCode Objective-c Cocoa的简单理解 Xcode Xcode说的通俗一点就是开发OS X 和 iOS 应用程序的. 如果我们想要认真点说 ,Xcode 是运行在操作系统Mac ...

  7. C语言编程对缓冲区的理解

    解析C语言编程对缓冲区的理解 转载自:http://soft.chinabyte.com/database/47/12481547.shtml 下面介绍缓冲区的知识. 一.什么是缓冲区 缓冲区又称为缓 ...

  8. 浏览器解析jsx_简单理解JavaScript,TypeScript和JSX

    原标题:简单理解JavaScript,TypeScript和JSX Java: 基本概念: Java一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为Java引 ...

  9. CPD配准算法及代码的简单理解(Coherent Point Drift)

    我的毕业设计用到了CPD算法,以及CPD代码工具包,当时刚开始接触CPD时在网上没找到几篇教程或是经验总结的东西.现在毕设做完了,就结合我的理解写一篇文章.可能写的会有点乱,因为我也是一时兴起想要做一 ...

  10. 简单c语语言游戏教案大全,大班语言活动教案大全简单趣味

    从小培养幼儿学说普通话的兴趣.同时家长应注意用规范的语言来与幼儿进行日常交谈. 以下是小编精心收集整理的幼儿园大班语言活动方案,下面小编就和大家分享,来欣赏一下吧. 幼儿园大班语言活动方案1 活动目标 ...

最新文章

  1. 正则表达式用户名密码电话身份证Email使用
  2. 【译】GraphQL vs. REST
  3. JS是世界上最好的语言—— 使用Electron开发桌面应用(一)
  4. 【Java学习笔记之一】java关键字及作用
  5. idea 的lombok安装完不生效的办法
  6. java asynccontext,超时后的JavaEE 6 AsyncContext行为
  7. JavaScript基础介绍
  8. 案例学习BlazeDS+Spring之四InSync02使用RemoteObject事件
  9. hdu 1588 Gauss Fibonacci
  10. Structs 2 session 学习
  11. jquery的语法结构包括哪几部分?_食品包装设计包括哪几个基本部分?
  12. Java毕业设计教程源码分享——简易网盘
  13. Unity3d Google Play内购尝试客户端坑记
  14. “狗屁不通文章生成器”项目登顶GitHub热榜~
  15. Android安全启动学习(五):Android Verified Boot 2.0
  16. 蓝桥杯试题 数列排序
  17. R 线性模型 检验异常观测值
  18. iOS的 gRPC 之路
  19. JAVA架构师面试分享—链家网
  20. 【lizhi125】Cameyo - 简单几步轻松制作单文件绿色版软件!

热门文章

  1. xshell官网链接打不开了
  2. 大数据产品推荐:神策分析——可私有化部署的用户行为分析平台
  3. QQ用户文件夹下即(user文件夹) 各个文件都是干什么的
  4. Python中文文档概览
  5. host速度 mtk usb_MTK功能机MT2503平台USB充电电流设置
  6. Android SDK的环境变量配置
  7. java sql 搜索拼音
  8. 数值转换:二进制、八进制、十六进制转换为十进制
  9. 虚拟机Linux IP地址更改
  10. gps高斯utm_高斯投影与UTM投影的区别