C语言按位取反~的简单理解
学习按位取反时,一直不是很理解,为啥对0取反就是-1,对76取反就是-77,网上有说记住x+(~x)=-1就可以了,可还是有点难懂。所以我来解释一波为啥对0取反就是-1?
- 十进制数 0 的十六进制表示为 0000 0000
- 对其~(取反)后得到 1111 1111
- 此时这个值转化为十进制就是255
- 此时 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
参考文献:
https://zhidao.baidu.com/question/2208490602456362988.html ↩︎
C语言按位取反~的简单理解相关推荐
- 对于C语言函数递归的简单理解(新手入门必看!!!)
什么是函数递归? 程序调用自身的编程技巧称为递归(recursion). 递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接 调用自身的 一种方法,它通常把一个大型 ...
- c语言理解参数,c语言中对可变参数列表的简单理解
函数原型中一般情况下参数的数目是固定的,但是如果想在不同的时候接收不定数目的参数时该怎么办呢?c语言提供了可变参数列表来实现. 可变参数列表是通过宏来实现的,这些宏定义在stdarg.h的头文件中.头 ...
- 关于C语言函数的简单理解
关于C语言函数的简单理解 C语言中的函数 在C语言中,函数是构成程序的基本模块.程序的执行从main()函数的入口开始,到main()函数的出口结束,中间循环.往复.迭代的调用一个有一个函数.每个函数 ...
- python语言的计算生态规模有多大_【单选题】Python 语言的一个重要特点是它有较多的计算生态,简单理解为第三方提供的可用编程模块 / 函数库 / 组件,这个规模有多大?...
[单选题]Python 语言的一个重要特点是它有较多的计算生态,简单理解为第三方提供的可用编程模块 / 函数库 / 组件,这个规模有多大? 更多相关问题 [问答题,简答题] 顾客关系管理系统如何给企业 ...
- 最简单理解并实现斐波那契数列函数(c语言)
实现斐波那契数列数列函数前我们要知道它是什么? 最简单理解就是一个数列为:0 1 1 2 3 5 8 13 21...... 第一个数为0第二个数为1,之后的每个数为前面两个数的的和(是不是很简单呢) ...
- 我对XCode Objective-c Cocoa的简单理解
我对XCode Objective-c Cocoa的简单理解 Xcode Xcode说的通俗一点就是开发OS X 和 iOS 应用程序的. 如果我们想要认真点说 ,Xcode 是运行在操作系统Mac ...
- C语言编程对缓冲区的理解
解析C语言编程对缓冲区的理解 转载自:http://soft.chinabyte.com/database/47/12481547.shtml 下面介绍缓冲区的知识. 一.什么是缓冲区 缓冲区又称为缓 ...
- 浏览器解析jsx_简单理解JavaScript,TypeScript和JSX
原标题:简单理解JavaScript,TypeScript和JSX Java: 基本概念: Java一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为Java引 ...
- CPD配准算法及代码的简单理解(Coherent Point Drift)
我的毕业设计用到了CPD算法,以及CPD代码工具包,当时刚开始接触CPD时在网上没找到几篇教程或是经验总结的东西.现在毕设做完了,就结合我的理解写一篇文章.可能写的会有点乱,因为我也是一时兴起想要做一 ...
- 简单c语语言游戏教案大全,大班语言活动教案大全简单趣味
从小培养幼儿学说普通话的兴趣.同时家长应注意用规范的语言来与幼儿进行日常交谈. 以下是小编精心收集整理的幼儿园大班语言活动方案,下面小编就和大家分享,来欣赏一下吧. 幼儿园大班语言活动方案1 活动目标 ...
最新文章
- 正则表达式用户名密码电话身份证Email使用
- 【译】GraphQL vs. REST
- JS是世界上最好的语言—— 使用Electron开发桌面应用(一)
- 【Java学习笔记之一】java关键字及作用
- idea 的lombok安装完不生效的办法
- java asynccontext,超时后的JavaEE 6 AsyncContext行为
- JavaScript基础介绍
- 案例学习BlazeDS+Spring之四InSync02使用RemoteObject事件
- hdu 1588 Gauss Fibonacci
- Structs 2 session 学习
- jquery的语法结构包括哪几部分?_食品包装设计包括哪几个基本部分?
- Java毕业设计教程源码分享——简易网盘
- Unity3d Google Play内购尝试客户端坑记
- “狗屁不通文章生成器”项目登顶GitHub热榜~
- Android安全启动学习(五):Android Verified Boot 2.0
- 蓝桥杯试题 数列排序
- R 线性模型 检验异常观测值
- iOS的 gRPC 之路
- JAVA架构师面试分享—链家网
- 【lizhi125】Cameyo - 简单几步轻松制作单文件绿色版软件!