代码之谜(一)- 有限与无限(从整数的绝对值说起)

 

一、引子

开始本章之前我先提个问题:“如果一个整数的绝对值等于它自己,那么这个数是几?”如果你回答是 0 和 所有正数,那么请你耐心读完这篇文章吧。

本章是我『代码之谜』系列的第二篇,前一篇『代码之谜 - 开篇/前言/序』简单介绍了计算机与数学的不同。

数学中有许多复杂深刻的矛盾,数学家的工作就是解释或者反驳这些矛盾, 例如有限与无限、连续与离散、存在与构造、逻辑与直观、具体与抽象、概念与计算等等。

在本章中,我们把目标缩小,主要讨论内容

  • 概念: 有限与无限
  • 对象: 8bit整数

二、绝对值之谜

终于到主题了,也许你很想知道“负数的绝对值可能等于自己吗?”,也就是 “如果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

神奇吗,尼玛,居然又回到自己了。

C语言:无符号整数进制转换的源代码实现 位权是构成数字系统的基础概念之一,它指的是每个数字位(bit)在数值中的权重。在二进制系统中,位权从右向左依次以2的幂次递增,最右边的位是2的0次幂,即1。位权的概念对于理解数字在不同进制中的表达至关重要。位权不仅适用于二进制,还适用于八进制、十六进制等任意进制系统。 阅读详情

相关推荐

数据结构试题库集及答案

数据结构试题库集及答案

02-Node.js基础(一)

Node.js 基础

m0_48670609的博客 832

Cisco Packet Tracer 7.3免登录技巧:3种方法快速跳过注册界面(附详细截图)

本文针对Cisco Packet Tracer 7.3启动时遇到的登录界面问题,提供了三种合法高效的解决方案。详细介绍了如何利用官方访客模式快速启动、注册思科账号实现一劳永逸登录,以及通过调整本地安装配置优化启动流程,帮助网络学习者与备考者绕过繁琐步骤,快速进入实验环境。

weixin_29305337的博客 738

nodejs的简单复习

判断一个字符串在不在某个字符串里面let index1 = str.indexOf('宇宙')//0截取字符串// 江西修改字符串let str3 = str.replace("宇宙","互联网")// 互联网的中心——江西软件职业技术大学分割字符串大小写转换//abcdefg//ABCDEFG。

PCthedream的博客 755

深入解析ffmpeg编码错误:avcodec_send_frame()返回-22的排查与修复

本文深入解析FFmpeg编码中avcodec_send_frame()返回-22(AVERROR(EINVAL))错误的根本原因与系统排查方法。核心问题通常在于编码器未正确打开或上下文传递错误。文章提供了从检查编码器查找、确认avcodec_open2()调用,到验证上下文传递的完整修复指南,并附有可运行的代码示例,帮助开发者快速定位并解决这一常见编码障碍。

weixin_28049429的博客 390

Java接入DeepSeek大模型:从零实现流式对话+多轮会话管理(完整项目实战)

emitter.completeWithError(new RuntimeException("连接DeepSeek服务超时"));private static final Set<String> BLACK_WORDS = Set.of("暴力", "色情", "政治敏感");emitter.onCompletion(() -> log.info("SSE连接完成"));emitter.onTimeout(() -> log.warn("SSE连接超时"));// 每个路由基础连接数。

wjianwei666的专栏 926

数据结构与算法 Data Structures and Algorithms(作业1)

Question 1 下列不属于线性结构的是: 串 队列 栈 二叉树 Question 2 以下哪种结构是逻辑结构,而与存储和运算无关: 单链表 散列表 线性表 顺序表 Question 3 计算运行下列程序段后m的值: n = 10; m = 0; for (i =1; i     for (j = 2*i; j

理想主义不死 2796

ER图从入门到精通:数据库建模全攻略

本文为数据库建模领域的 ER 图全面指南,系统解析从基础概念到实战应用的核心要点。首先介绍 ER 图的定义、三大组成元素(实体、属性、关系)及三种基础关系类型(一对一、一对多、多对多);其次详解绘制流程,涵盖工具选择(如 Visio、PowerDesigner)、需求分析方法及实体 - 属性 - 关系的分步建模技巧;进一步探讨弱实体、复合属性等高级概念,结合范式理论讲解模型优化策略;针对实体属性混淆、关系类型误判等常见问题提供解决方案;最后通过电商系统、图书馆管理系统等实际案例展示 ER 图设计全流程。

邓邓子的博客 4213

代码之谜(零) - 其实,你不懂代码

2012年9月28日 13时32分 新增 最近看本文评论,争议很多,我先说说这篇文章的前世今生吧。 我原文标题是『代码之谜 - 开篇/前言/序』,副标题是『其实,你不懂代码』,本来打算用“其实,代码中的运算符不等价于数学符号”。原文我写于2010年底,当时写在 evernote 中,用了”群“、”域“、”集合“、”关系“的概念解释了计算机中用二进制表示的离散的数和现实中连续的数之间...

iteye_6378的博客 312

【AI】获取各类AI大模型api-key的快速教程(OpenAI、Gemini、Claude、DeepSeek)

【AI】获取各类AI大模型api-key的快速教程(OpenAI、Gemini、Claude、DeepSeek)

funfan的博客 2930

CS之攻击菜单详解-后门生成与上线

能够生成如HTA文档、office宏、payload生成器、exe程序。 windows可执行程序exe 可以看到能生成两种windows可执行程序,其分别代表stage分阶段和unstage(stageless)不分阶段。传送门 ——>Cobalt Strike中payload的stage与unstage区别 选择监听器后,按需生成不同类型的exe 然后在目标机器运行即可上线 payload生成器 选择生成如下类型的后门 ——>https://che...

渗透之路,攻防之间皆学问 6805

代码之谜(一) - 有限与无限 (从整数的绝对值说起)

一、引子 开始本章之前我先提个问题:“如果一个整数的绝对值等于它自己,那么这个数是几?”如果你回答是 0 和 所有正数,那么请你耐心读完这篇文章吧。 本章是我『代码之谜』系列的第二篇,前一篇『代码之谜 - 开篇/前言/序』简单介绍了计算机与数学的不同。 数学中有许多复杂深刻的矛盾,数学家的工作就是解释或者反驳这些矛盾, 例如有限与无限、连续与离散、存在与构造、逻辑与直观、具体与抽

justjavac(迷渡) 1万+

在 SAP BTP 中为 SAP AI Core 创建 Service Instance 和 Service Key 的完整实战指南

摘要:本文详细介绍了在SAP BTP上创建AI Core服务实例和密钥的关键步骤,这是实现ABAP系统与Gen AI大语言模型集成的核心技术环节。文章通过一个制造业财务问答场景的案例,系统梳理了从前提条件准备、架构理解到具体操作的全过程,重点解析了service instance创建、X.509证书配置等关键节点。特别强调了Extended计划选择、证书格式等易错点,为ABAP开发人员实现Gen AI场景提供了实用指南。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 271

【转】代码之谜(一) - 有限与无限 (从整数的绝对值说起)

一、引子 开始本章之前我先提个问题:“如果一个整数的绝对值等于它自己,那么这个数是几?”如果你回答是 0 和 所有正数,那么请你耐心读完这篇文章吧。 本章是我『代码之谜』系列的第二篇,前一篇『代码之谜 - 开篇/前言/序』简单介绍了计算机与数学的不同。 数学中有许多复杂深刻的矛盾,数学家的工作就是解释或者反驳这些矛盾, 例如有限与无限、连续与离散、存在与构造、逻辑与直观、具体与抽

wfx的专栏 375

1、动作捕捉技术:概述与历史

本博文全面介绍了动作捕捉技术的概念、历史演变、类型分类以及完整的工作流程。从早期的连续摄影技术到现代数字动作捕捉系统,文章深入探讨了光学、磁性和机械动作捕捉系统的优缺点及适用场景,并详细解析了动作捕捉数据的生成原理与数学基础。此外,还涵盖了特殊部位如手部、面部和木偶的动作捕捉方法,并讨论了动作捕捉在动画制作、虚拟现实、医疗康复等领域的广泛应用与发展前景。

apple5的专栏 219

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

代码之谜(一)- 有限与无限 从整数的绝对值说起

最近看了一个系列的文章,感觉很受启发,在此转载:http://justjavac.com/codepuzzle/2012/09/25/codepuzzle-introduction.html

zzhou910的专栏 671

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

代码之谜(一) - 有限与无限(从整数的绝对值说起)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34248023的博客 125

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【转载】代码之谜(一)- 有限与无限(从整数的绝对值说起)

原博客链接:http://justjavac.iteye.com/blog/1698691 一、引子 开始本章之前我先提个问题:“如果一个整数的绝对值等于它自己,那么这个数是几?”如果你回答是 0 和 所有正数,那么请你耐心读完这篇文章吧。 本章是我『代码之谜』系列的第二篇,前一篇『代码之谜 - 开篇/前言/序』简单介绍了计算机与数学的不同。 数学中有许多复杂深刻的

菜鸟进阶中。。。 373

代码之谜(一)- 有限与无限(从整数的绝对值说起)

一、引子 开始本章之前我先提个问题:“如果一个整数的绝对值等于它自己,那么这个数是几?”如果你回答是 0 和 所有正数,那么请你耐心读完这篇文章吧。 本章是我『代码之谜』系列的第二篇,前一篇『代码之谜 - 开篇/前言/序』简单介绍了计算机与数学的不同。 数学中有许多复杂深刻的矛盾,数学家的工作就是解释或者反驳这些矛盾, 例如有限与无限、连续与离散、存在与构造、逻辑与直观、具体与抽象、概念与计...

weixin_30587025的博客 84

代码之谜 - 有限与无限 (从整数的绝对值说起)(转)

一、引子 开始本章之前我先提个问题:“如果一个整数的绝对值等于它自己,那么这个数是几?”如果你回答是 0 和 所有正数,那么请你耐心读完这篇文章吧。 本章是我『代码之谜』系列的第二篇,前一篇『代码之谜 - 开篇/前言/序』简单介绍了计算机与数学的不同。 数学中有许多复杂深刻的矛盾,数学家的工作就是解释或者反驳这些矛盾, 例如有限与无限、连续与离散、存在与构造、逻辑与直观、具体与抽

住在半山腰的螃蟹专栏 513

代码之谜(一)- 有限与无限

一、引子 开始本章之前我先提个问题:“如果一个整数的绝对值等于它自己,那么这个数是几?”如果你回答是 0 和 所有正数,那么请你耐心读完这篇文章吧。 本章是我『代码之谜』系列的第二篇,前一篇『代码之谜 - 开篇/前言/序』简单介绍了计算机与数学的不同。 数学中有许多复杂深刻的矛盾,数学家的工作就是解释或者反驳这些矛盾,例如有限与无限、连续与离散、存在与构造、逻辑与直观、具体与抽象、概念与计算

GarfieldEr007的专栏 1106

[乐意黎转载]代码之谜--justjavac(迷渡)

代码之谜 http://justjavac.com/codepuzzle.html 代码之谜(零)- 开篇/前言/序  http://justjavac.com/codepuzzle/2012/09/25/codepuzzle-introduction.html 代码之谜(一)- 有限与无限 从整数的绝对值说起 http://justj

打杂人-aerchi 794

分数转有限小数的算法实现与数论原理

在计算机科学和数学中,分数与小数之间的转换是一个基础而重要的概念。有限小数是指可以精确表示为a/10^n形式的有理数,其判断标准基于分母的质因数分解——当且仅当分母的质因数只包含2和5时,分数才能表示为有限小数。这一原理在算法设计中具有重要价值,特别是在需要高精度计算的场景如财务系统和科学计算中。通过欧几里得算法化简分数,并去除分母中的2和5因子,可以高效判断分数是否为有限小数。本文以GESP竞赛真题为例,详细讲解如何实现时间复杂度为O(log q)的优化算法,并探讨其在编程竞赛和工程实践中的应用。

weixin_31714129的博客 332
上一篇: 为什么中国的程序员总被称为码农?
下一篇: 你为什么薪水那么低(二):生产力
SleepInDelphi
博客等级 码龄19年 32粉丝 388原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值