首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

计算机程序思维逻辑 (4) - 整数二进制表示与位运算

上节我们提到正整数相乘结果居然出现了负数,要理解这个行为,我们需要看下整数在计算机内部二进制表示。 十进制 要理解整数二进制,我们先来看下熟悉十进制。...正整数二进制表示 正整数二进制表示与此类似, 只是在十进制中,每个位置可以有10个数字,从0到9,但在二进制中,每个位置只能是0或1。...看一些数字例子吧: 二进制 十进制 10 2 11 3 111 7 1010 10 负整数二进制表示 十进制数表示就是在前面加一个负数符号-,例如-123。但二进制如何表示负数呢?...其他类型整数也类似,负数能多表示一个数。 负整数为什么采用补码呢? 负整数为什么要采用这种奇怪表示形式呢?原因是:只有这种形式,计算机才能实现正确加减法。...就是这样,看上去可能比较奇怪和难以理解,但这种表示其实是非常严谨和正确,是不是很奇妙? 理解了二进制加减法,我们就能理解为什么正数运算结果可能出现负数了。

98890

为什么0.1 + 0.2 不等于 0.3 ?

在很多编程语言中,我们都会发现一个奇怪现象,就是计算 0.1 + 0.2,它得到结果并不是 0.3,比如 C、C++、JavaScript 、Python、Java、Ruby 等,都会有这个问题。...在二进制中,,浮点数通常使用 IEEE 754 标准进行表示,无法准确表示小数有 0.1、0.2 或 0.3 这样数字,因为它使用是二进制浮点格式。...这个近似值是通过将无限循环二进制小数转换为有限位数浮点数表示来实现。因此,当我们在计算机中进行浮点数运算时,结果可能会有微小误差。...,但在计算机浮点数表示中,它可能被截断或舍入为 0.00011001100110,这就导致了 0.1 + 0.2 在计算机中可能不等于 0.3,而是略微有所偏差。...()方法虽然在显示上解决了问题,但它并没有改变数字实际值,它只是改变了数字表示形式。

7710
您找到你想要的搜索结果了吗?
是的
没有找到

关于二进制世界秘密

我们一般在软件开发中用十进制数表逻辑运算等,也会被计算机转换为二进制数处理。对于二进制数,计算机不会区分他是 图片、音频文件还是数字,这些都是一些数据结合体。...二进制转十进制表示图 也就是说,二进制数代表 00100111 转换成十进制就是 39,这个 39 并不是 3 和 9 两个数字连着写,而是 3 * 10 + 9 * 1,这里面的 10 , 1 就是位权...那么我们所说二进制数其实就是 用0和1两个数字来表示数,它基数为2,它数值就是每个数位数 * 位权再求和得到结果,我们一般来说数值指就是十进制数,那么它数值就是 3 * 10 + 9 *...1 - 1 分析图 奇怪,1 - 1 会变成 130 ,而不是0,所以可以得出结论 1000 0001 表示 -1 是完全错误。 那么正确该如何表示呢?...不过,有一需要注意,当运算结果为负时候,计算结果值也是以补数形式出现,比如 3 - 5 这个运算,来看一下解析过程 ?

60120

关于二进制世界秘密

我们一般在软件开发中用十进制数表逻辑运算等,也会被计算机转换为二进制数处理。对于二进制数,计算机不会区分他是 图片、音频文件还是数字,这些都是一些数据结合体。...二进制转十进制表示图 也就是说,二进制数代表 00100111 转换成十进制就是 39,这个 39 并不是 3 和 9 两个数字连着写,而是 3 * 10 + 9 * 1,这里面的 10 , 1 就是位权...那么我们所说二进制数其实就是 用0和1两个数字来表示数,它基数为2,它数值就是每个数位数 * 位权再求和得到结果,我们一般来说数值指就是十进制数,那么它数值就是 3 * 10 + 9 *...1 - 1 分析图 奇怪,1 - 1 会变成 130 ,而不是0,所以可以得出结论 1000 0001 表示 -1 是完全错误。 那么正确该如何表示呢?...不过,有一需要注意,当运算结果为负时候,计算结果值也是以补数形式出现,比如 3 - 5 这个运算,来看一下解析过程 ?

53420

不是科班生,不会知道计算机中「小数点」问题!

也就是说「定」是指固定意思,「」是指小数点,小数点位置固定即定点数名字由来。...8 bit)表示,用定点数表示如下(D为十进制缩写,B为二进制缩写): 100(D) = 01100100(B) 这种情况用定点数表示都比较简单,按照十进制转为二进制规则,即可得到结果。...主要为了方便大家看 这种情况用定点数表示都比较简单,按照十进制转为二进制规则,即可得到结果。...对于数字 1.5 用定点数表示时,先处理整数1,那5 bit表示是这样: 1(D) = 00001 接着是小数上0.5,用3 bit表示是这样: 0.5(D) = 0.100(B) 再把两个部分合起来...此时,这个整数部分二进制最大值只能是 11111,即十进制 31;小数部分二进制最大只能表示 0.111,即十进制 0.875。

19410

JavaScript深度剖析之变量、函数提升:从表面到本质

var a = 2; • 鉴于上一个代码片段所表现出某种非自上而下行为特点,你可能会认为这段代码会输出 2。...• 换句话说,先有蛋(声明)后有鸡(赋值) • 只有声明本身会被提升,而赋值或其他运行逻辑会留在原地。如果提升改变了代码执行顺序,会造成非常严重破坏。...function foo() { console.log(3); } • 从上面代码可以看出,在同一个作用域内重复定义是很糟糕,经常会导致各种奇怪问题。...先有鸡(声明),后有蛋(赋值)。 2....重复定义函数声明后面的会覆盖前面的。 4. 函数声明会被提升,但函数表达式并不会被提升。 5. 只有声明本身会被提升,而包括函数表达式赋值在内赋值操作并不会被提升。

6110

什么是定点数?

也就是说「定」是指固定意思,「」是指小数点,小数点位置固定即定点数名字由来。 定点数如何表示数字? 既然定点数只是表示数字一种方式,那试想,它可以表示整数吗?可以表示小数吗? 答案是肯定。...,原理是相同,只需要把整数部分、小数部分,按照十进制转二进制规则,分别转换即可。...,由于小数点固定在最高位,同样以 1 个字节(8 bit)表示,用定点数表示如下: 0.125(D) = 0.00100000(B) 从以上例子可以看出,这 2 种情况用定点数表示都比较简单,按照十进制转为二进制规则...对于数字 1.5 用定点数表示就是这样: 1.5(D) = 00001 100(B) 数字 25.125 用定点数表示就是这样: 25.125(D) = 11001 001(B) 这就是用定点数表示一个小数方式...但是有没有发现一个问题,我们约定了前 5 位表示整数部分,后 3 位表示小数部分,此时这个整数部分二进制最大值只能是 11111,即十进制 31,小数部分二进制最大只能表示 0.111,即十进制

2.2K10

你真的会 C 语言吗

身为一名程序员,或多或少都会了解一 C 语言,我现在还清楚地记得,大一刚接触 C 语言时被它所支配恐惧。...在 C 语言中,无符号整数是 4 个字节,1 个字节为 8 位,十进制数 0 用二进制表示为 0000 0000 0000 0000 0000 0000 0000 0000,计算机做减法是通过补码进行,...1111 1111 1111 1111 1111 1111 1111,因为之前定义形参时候将 length 定义为无符号整数,所以 C 语言将计算结果按照无符号整数解释,得到十进制数字为 4294967295...这个程序表面上一切正常,很符合正常人思路,数组下标不能为负数,因此形参 length 用无符号整数表示;停止条件 i <= length - 1 看上去也十分自然。...但是将这两个条件组合在一起,意料之外事情就发生了。C 语言确实很强大,但是如果我们计算机基础知识不扎实,很可能出现各种奇奇怪 bug。

99520

基于 FPGA 数字表示

定点量化 2.4 小数部分截断 2.5 一种不同方法 Trounding 三、 浮点数定义及表示 3.1 标 准 浮 数 表 述 3.2 浮点数短指数表示 3.3 浮点数应用 OVER --...当在这种数字系统中执行二进制运算时, 将遇到奇怪问题, 这是由于数字 0 有两个表示版本。 事实上,-0 小于+0,这是由于使用反码表示时: -0+ 1 =+0;+0 -1=-0。   ...用十进制表示小数很容易。 通过引入十进制小数点来描述非整数, 并在小数点右边插人数字。 例如: ? 在式中, 字符串“10.34”代表数字 10. 34 ,即 10 乘方倍数总和。   ...同样归一化操作也适用于二进制, 而且大多数数字信号处理系统也使用二进制。   下面考虑 二 进 制 补 码 中 8 位 数 值。...等价于十进制中: 0.28125 X 0.7578125=0.213134765625   注意: 在 数 字 信 号 处 理 系 统 中, 在 设 计 者 眼 中, 二 进 制 是 存 在

1.2K20

探索计算机内部神秘语言:二进制魅力

为了详细说明这个问题,我们先将一个二进制数 00100111 转换为十进制数进行观察。将二进制数转换为十进制方法是,直接将各个位置上值乘以相应位权,然后相加得到结果。...那么,让我们来将上述二进制数转换为十进制数。根据转换规则,将二进制数 00100111 转换为十进制数,结果为 39。...这里 39 不是由数字 3 和 9 连在一起写成,而是由 3 乘以位权 10 和 9 乘以位权 1 相加得到。而这些位权,从高位到低位依次为 7、6、5、4、3、2、1、0。...我们先用上面提到1000 0001(我们假设它是1补码,如果不了解,请参考前文,先不管补码是否是对)来表示一下。奇怪,1 - 1 为什么会变成 130 而不是 0?...这个结果看起来很奇怪,我们来分析一下。对于正数 1,它二进制表示是 0000 0001。现在我们将其转成补码。

25910

【蓝桥杯历年真题】每日算法详解解析(CC++)

第二行一个正整数 Ma,表示 X 进制数 A 位数。 第三行 Ma 个用空格分开整数,表示 X 进制数 A 按从高位到低位顺序各个数位上数字十进制表示。...第四行一个正整数 Mb,表示 X 进制数 B 位数。 第五行 Mb 个用空格分开整数,表示 X 进制数 B 按从高位到低位顺序各个数位上数字十进制表示。...请注意,输入中所有数字都是十进制。 【输出格式】 输出一行一个整数,表示 X 进制数 A − B 结果最小可能值转换为十进制后再模 1000000007 结果。...同时,当炸雷被引爆时,在其爆炸范围内炸雷也会被引爆。现在小明想知道他这次共引爆了几颗炸雷? 你可以把炸雷和排雷火箭都视为平面上一个。一个处可以存在多个炸雷和排雷火箭。...小明想知道他最少使用多少次魔法可以让所有的竹子高度都变为 1。 【输入格式】 第一行为一个正整数 n,表示竹子棵数。 第二行共 n 个空格分开正整数 hi,表示每棵竹子高度。

98010

前端代码规范常见错误 一

,降低奇怪情况发生概率 这里推荐使用 const 来声明变量,我们需要避免全局命名空间污染。...如果输入 string 以任何其他值开头, radix 是 10 (十进制)。 如果第一个字符不能转换为数字,parseInt会返回 NaN。...为了算术目的,NaN 值不能作为任何 radix 数字。你可以调用isNaN函数来确定parseInt结果是否为 NaN。...如果将NaN传递给算术运算,则运算结果也将是 NaN 不传radix可能返回八进制结果,也可能返回十进制结果。 总是指定一个基数(radix)可以避免这种不可靠行为。...4、下面的奇怪写法 如果当前if判断下没有要处理事情那么请直接去掉 5、逗号及分号不严谨 此处没有什么说明,这应该是写代码时候粗心导致,请避免这样粗心大意带来错误异常,要求每一句结束请用分号结束

32330

《Java从入门到失业》第一章:计算机基础知识(1.1):二进制和十六进制

因此我也打算从这开始,虽然这些东西看起来和Java没啥关系,就当做我一个情怀好了,也可以给大家增加一些奇怪知识。如果已经了解或者不想看,直接忽略该篇就好。...小学生都知道,逢10进1,具体总结如下: 一共有0~9共10个数字 一个十进制数值由若干个数字组成,数字数量叫位数,例如3位数988 每个位上数字取值范围为0~9 同位两个数字相加,超过10部分向高位进一...到这里,我们把十进制就搞明白了,可以总结十进制特点如下: 一共有0~9共10个数字 每个位上数字取值范围为0~9 同位两个数字相加,逢10进1 相邻2个位,差别是10倍 假设一个十进制数值N,一共有...我们来对比一下十进制和二进制: 对比项 十进制 二进制 数字 0~9 0~2 相邻2个位差别 10倍 2倍 n位数可取数值数量 10n 2n n位数表示最大数值 10n -1 2n -1 n位数值公式...哇塞,好神奇,都是16,好像找到规律了,对了,就是可以把一个二进制数,4个4个打包,用一个十六进制数表示,这样就大大缩短了一个二进制数书写。

57820

Python 整数与 Numpy 数据溢出

数据超出能表示最大值,就会出现奇奇怪结果。...,而且对 Numpy 了解不多,还错看了图中结果,误以为每一个数据都是错误,所以就解答不出来。 最后,经过学习群里一番讨论,我才终于明白是怎么回事,所以本文把相关知识做个梳理。...写法上是在数字后面加大写字母 L 或小写 l,如 1000L 当一个整数超出短整数范围时,它会自动采用长整数表示。举例,打印 2**100 ,结果会在末尾加字母 L 表示它是长整数。...但是到了 Python 3,情况就不同了:它仅有一种内置整数,表示为 int,形式上是 Python 2 短整数,但实际上它能表示范围无限,行为上更像是长整数。...对照前文截图,里面只有两组数字相乘时没有溢出:100007*4549、100012*13264,其它数据组都溢出了,所以出现奇怪负数结果。

2.1K41

JavaScript初级玩法(4)—两数交换多种方法

,如果只是交换数字,我们还可以用积,思路是一样。...,对应位,只有一个1时候,结果才为1,否则就是0 简单理解就是先把每个十进制数,转换为二进制数字,然后比较二进制各个位置上数字,只有一个1时候,这个位置结果就取1,否则就取0,最后转为十进制...======== 011 转换为十进制为 3 b = a^b; //5 a=6,6转二进制为 110 b=3,3转二进制为 011 110 011 ================ 101 转换为十进制为...总结 方法2 (求和交换),方法3 (按位异或),这两个方法比较局限,只能换数字,如果变量不是数字,就不能用了。...总结一下上面所有方法思路,交换两数,不是凭空就能换,终究还是要依靠一下别的数,只是不用把这个数表现出来,不用再声明一个变量而已。

50360

python入门教程Python 浮点数数据类型详解

“关注”和“赞”,是信任,是认可,是支持,是动力...... 如意见相佐,可留言。 本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充更新。...2 小数表示形式 2.1 十进制表示形式 我们平时看到小数形式,必须包含一个小数点。...如下所示: num_float = 22.1 num2_float = 35.8 num3_float = 22.0 2.2 指数表示形式 2.2.1 指数表示形式概述 Python 小数数表示形式...class float([x]) x 如果是字符串,则它必须是只包含十进制数字字符串,字符串前面可以有符号( + 或 - ),之前也可以有空格。...x 也可以是 NaN(非数字)、正负无穷大字符串。 x 如果是整数或浮点数,则返回具有相同值(在 Python 浮点精度范围内)浮点数。

46240

用JavaScript实现正整数十进制转二进制

十进制转二进制 十进制是我们常用计数方式,如:1,5,9,10,100;而二进制是计算使用计算方式,二进制有0和1组成。例如我们用十进制表示10,那么对应二进制 1010。...可以查看基维百科了解各种进制规则。 基维百科 简单实现正整数十进制转换二进制 十进制转换二进制是有一个公式,大家可以记住这个公式。...,就会发现出问题。...另外值得一提是,在JavaScript中,当数字253次方时,数值将会失去精度,导致数字值存在偏差。...100000000000000000000000000000000000000000000000000100 //函数转换结果: 100000000000000000000000000000000000000000000000000011 以后有空再写十进制浮点数和负数转二进制以及二进制转换为十进制实现方式吧

791120

二进制8进制10进制16进制代码_不同进制之间转换

为什么要使用进制数 数据在计算机中表示,最终以二进制形式存在 , 就是各种 电影中那些 0101010… 数字 ; 我们操作计算机 , 实际 就是 使用 程序 和 软件...这一使得三种进制之间可以非常直接地互相转换 ; 8进制或16进制 既 缩短了二进制数,还能 保持了二进制数表达特点。转换还方便 . 进制介绍 进制 : 是计算机中数据一种表示方法。...N进制数可以用0~(N-1) 数表示, 超过9用字母A-F 表示 . 10进制 先说 我们最 熟悉 10进制 , 就是 用 0~9 数表示 , 逢 10 进 1 . 16进制 如果是...2进制 和 8进制 2进制 由 0-1组成 8进制 由 0-7组成 进制转换公式 二进制转换十进制 八进制转换十进制 十六进制转换十进制 如何快速进行 2进制,10进制...如(上行为二制数,下面为对应十六进制): 1111 1101 , 1010 0101 , 1001 1011 F D , A 5 , 9 B 16进制数转换为二进制数 反过来,当我们看到 FD

2.4K20

什么是浮点数?

我们主要介绍了在计算机中使用定点数表数字方式。 简单回顾一下,简单来说,用定点数表数字时,会约定小数点位置固定不变,整数部分和小数部分分别转换为二进制,就是定点数结果。...表示正,1 表示负 M:尾数,用小数表示,例如前面所看到 8.345 * 10^0,8.345 就是尾数 R:基数,表示十进制数 R 就是 10,表示二进制数 R 就是 2 E:指数,用整数表示,例如前面看到...因为十进制 0.2 无法精确转换成二进制小数,而计算机在表示一个数字时,宽度是有限,无限循环小数存储在计算机时,只能被截断,所以就会导致小数精度发生损失情况。 浮点数范围和精度有多大?...最后,我们再来看一下,用浮点数表示一个数字,其范围和精度能有多大?...它能表示精度有多小呢? float 能表示最小二进制数为 0.0000....1(小数点后22个0,1个1),用十进制数表示就是 1/2^23。

1.3K21
领券