一、引子
开始本章之前我先提个问题:“如果一个整数的绝对值等于它自己,那么这个数是几?”如果你回答是 0 和 所有正数,那么请你耐心读完这篇文章吧。
本章是我『代码之谜』系列的第二篇,前一篇『代码之谜 - 开篇/前言/序』简单介绍了计算机与数学的不同。
数学中有许多复杂深刻的矛盾,数学家的工作就是解释或者反驳这些矛盾, 例如有限与无限、连续与离散、存在与构造、逻辑与直观、具体与抽象、概念与计算等等。
在本章中,我们把目标缩小,主要讨论内容
二、绝对值之谜
终于到主题了,也许你很想知道“负数的绝对值可能等于自己吗?”,也就是 “如果x等于-x,那么x有几个解?”按照我一贯的作风,我是不会轻易告诉你答案的。 《编程珠玑》记载,作者告诉了他同事一个结果,而不是方法,最后追悔莫及。 所以,我在这里要告诉你方法,而不是告诉你答案。
告诉你答案之前,首先得回答个问题:“整数(8bit)的表示范围是多少?”,(也许你已经把教科书的知识背下来了,是 -2^7 到 2^7-1,也就是 -128 到 +127,现在的计算机科学都快成为文科了^_^)。
如果你不知道也没关系,至少你知道 8bit 可以表示的整数个数是 2^8 个,这个数等于多少无所谓,但是,它一定是个偶数(256)。
那么这里就有一个很有意思的问题了,0既不是正数也不是负数,把0去掉的话,整数的个数就是奇数了,整数还剩 255 个。 奇数个整数不可能平均分成两部分(正数和负数),要么负数多一个,要么正数多一个。事实就是,负数比正数多一个,最小的负数是 -128, 最大的整数是 127。
现在的问题是, -128 的绝对值是多少呢? -(-128)等于多少呢?是溢出呢,还是等于它自己呢?也许计算机课本没有告诉你,整数是不会出现溢出异常的,整数的溢出被认为是正常的舍弃(其实只要很合理)。整数只有被0除才会异常,而浮点数,即使被0除也不会抛出异常。 浮点数除0的操作将放在本系列浮点数篇讨论。
绝对值等于自己的数有两个,0 和最小的负数。
你可能要像香港电影里女主角那样歇斯底里的大喊“绝对值怎么可能是负数呢? 不可能,我不信,我不信…”
忘掉你那可怜的数学知识吧,“发生这种事,大家都不想的。感情的事呢,是不能强求的。所谓吉人自有天相,做人呢,最要紧的就是开心…”跑题了,赶紧回来。
在经典数学(非皮亚诺算术系统,皮亚诺绝对是欧几里德的铁杆粉丝,要不怎么会有如此天才的构想,这个以后会给大家普及)中,绝对值定义为:“从原点到点A的距离,称为A的绝对值,它是一个非负数”。 既然讲到了距离,不妨剧透一下(本系列“逻辑篇”会涉及到),两个数的大小在数学中如何定义,“距离数轴原点的距离远近”,计算机中大小如何定义的呢?给大家留个作业吧(别告诉我是设计编程语言或者设计电脑的科学家规定的,计算机科学绝对不是文科)。
计算机中没有数轴,绝对值是如何定义的呢?看看java、C、Python的源码(感谢那些开源大牛),和咱们学的小学数学一样。
abs(x) := (x >= 0) ? x : -x
翻译过来就是,x的绝对值定义为:正数和0的绝对值等于它自己,负数的绝对值等于-x。(这里使用的是-x,而没有用0-x,因为在浮点数中,这两者是有区别的。)
三、深入 -x
那么 -x 是如何计算的呢?计算是数学概念,在计算机中,我们应该说 -x是如何求值的呢?还得回到源码,我只看了linux中关于C的源码,如果你看过其它语言源码发现和我说的不同,请联系我。 学过计算机原理的都知道,负数在计算机中以补码形式存储,计算补码的方式和取反操作类似。
符号位不变,其它位取反,最后加一。
比如 -5
原码: 1000,0101
其它位取反: 1111,1010
加一: 1111,1011
当我们求它的绝对值时如何操作呢
补码: 1111,1011 这是-5在计算机中的表示
各位取反: 0000,0100
加一: 0000,0101 此时结果为+5
现在我们回到最小的负数问题,最小的负数在计算机中表示为 1000,000,下面我们对这个数操作
补码: 1000,0000
各位取反: 0111,1111
加一: 1000,0000
神奇吗,尼玛,居然又回到自己了。
分享到:
相关推荐
代码 基于0-1整数规划枚举法离散型优化问题代码代码 基于0-1整数规划枚举法离散型优化问题代码代码 基于0-1整数规划枚举法离散型优化问题代码代码 基于0-1整数规划枚举法离散型优化问题代码代码 基于0-1整数规划枚举...
在编程中,计算一个数的绝对值是一项基本操作。绝对值指的是一个数在数轴上的距离,不考虑正负方向。在很多算法和数学问题中,我们都需要使用到这个概念。本节我们将深入探讨如何使用if语句来计算整数的绝对值,尤其...
代码之谜(一)讨论了有限与无限的概念,从整数的绝对值说起。该篇博客旨在让读者更好地理解代码中的有限和无限的关系。 4. 代码之谜(二)- 语句与表达式 代码之谜(二)讨论了语句与表达式的区别和联系。该篇...
本示例代码"py代码-例2-1-2 输入一个整数,输出其绝对值"旨在教授如何通过Python程序获取用户输入的整数并计算其绝对值。 首先,让我们了解如何在Python中读取用户输入。在Python 3.x中,我们可以使用内置函数`...
绝对值指的是一个数在数轴上的非负距离,即一个数的正数值,不考虑其正负符号。相反数则是指在数轴上与原数相隔原点等距离的那个数,它具有相反的符号。 1. 对于基础巩固部分: - 绝对值的定义是去掉数前面的负号...
0-1整数规划是一种特殊的线性规划问题,其中决策变量仅取0或1两个值。这种优化模型广泛应用于资源分配、生产计划、网络设计等多个领域。LINGO(Linear Interactive and General Objectives)是一款强大的数学建模...
【标题】中的知识点主要涉及到计算机组成原理的基本概念和编程实现,包括有符号整数的存储、数组的操作以及数值计算。具体来说: 1. **有符号数的表示**:在计算机中,有符号整数通常使用补码表示法,其中最高位...
0-1整数规划是运筹学中的一个重要分支,它属于线性规划的一种特殊形式,主要用来求解具有0或1取值约束的决策变量的优化问题。在实际应用中,这种模型常用于资源分配、生产计划、网络设计等多个领域。MATLAB作为一种...
绝对值是数学中的一个重要概念,尤其在中学数学教育中占据着基础地位。它涉及到数轴、代数性质、比较大小等多个方面。以下是对绝对值及相关知识点的详细解释: 1. **绝对值的几何定义**:在数轴上,表示数a的点与...
当`p`指向的节点的绝对值与`q`的绝对值相等时,`p->next`(即当前绝对值相同的节点)被标记为`free`,并从链表中删除。`p->next`随后被更新为`p->next->next`,跳过已被删除的节点。这个过程持续进行,直到遍历完整...
【华为OJ机试题 绝对值】是一个针对编程爱好者和求职者的重要资源包,尤其对于那些准备参加华为公司的在线编程面试(OJ,Online Judge)的应聘者来说,具有极高的学习价值。这个压缩包包含了多个编程题目,涵盖了...
在C代码中,我们可以定义一个名为`abs_value`的函数,它接受一个整数参数`num`,并返回`num`的绝对值。以下是可能的实现: ```c #include int abs_value(int num) { if (num ) { return -num; } else { ...
有3个整数a,b,c,由键盘输入,编写程序输出其中绝对值最大(或最小)的数。(提示:使用绝对值函数abs时必须加头文件#include)
输入包含5个整数(有符号数)的数组M,输出最大负数的绝对值(A类)。完成系统的总体设计, 画出模型机数据通路框图;设计微程序控制器(CISC 模型计算机) 的逻辑结构框图;设计机器指令格式和指令系统;设计时序...
- 分段函数处理:对于局部含有绝对值的函数,需要分别研究每一段的性质,然后综合考虑整体。 - 图像分析:利用函数图像来辅助理解函数的性质,如单调性、对称性和周期性。 4. **例题解析**: - 例1:涉及了...
本程序的功能是实现无限大的2个整数相加或者相减,供编程初学者参考
- 整数的绝对值:绝对值不大于11.1的整数包括从-11到11的所有整数,共23个。 4. **应用实例** - 在实际问题中,如食用调和油的检查,绝对值用于衡量测量值与标准值的偏差。如果一个值的绝对偏差不超过允许误差...