`
dandy
  • 浏览: 67313 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

循环者遇到了狼人

    博客分类:
  • java
阅读更多
请提供一个对i的声明,将下面的循环转变为一个无限循环。这个循环不需要使用任何5.0版的特性:
while (i != 0 && i == -i) {
}
这仍然是一个循环。在布尔表达式(i != 0 && i == -i)中,一元减号操作符作用于i,这意味着它的类型必须是数字型的:一元减号操作符作用于一个非数字型操作数是非法的。因此,我们要寻找一个非0的数字型数值,它等于它自己的负值。NaN不能满足这个属性,因为它不等于任何数值,因此,i必须表示一个实际的数字。肯定没有任何数字满足这样的属性吗?
嗯,没有任何实数具有这种属性,但是没有任何一种Java数值类型能够对实数进行完美建模。浮点数值是用一个符号位、一个被通俗地称为尾数(mantissa)的有效数字以及一个指数来表示的。除了0之外,没有任何浮点数等于其符号位反转之后的值,因此i的类型必然是整数型的。
有符号的整数类型使用的是2的补码算术运算:为了对一个数值取其负值,你要反转其每一位,然后加1,从而得到结果[JLS 15.15.4]。2的补码算术运算的一个很大的优势是,0具有唯一的表示形式。如果你要对int数值0取负值,你将得到0xffffffff+1,它仍然是0。
但是,这也有一个相应的不利之处,总共存在偶数个int数值——准确地说有232个——其中一个用来表示0,这样就剩些奇数个int数值来表示正整数和负整数,这意味着正的和负的int数值的数量必然不相等。这暗示着至少有一个int数值,其负值不能正确地表示成为一个int数值。
事实上,恰恰就有一个这样的int数值,它就是Integer.MIN_VALUE,即-231。他的十六进制表示是0x80000000。其符号位为1,其余所有的位都是0。如果我们对这个值取负值,那么我们将得到0x7fffffff+1,也就是0x80000000,即Integer.MIN_VALUE!换句话说,Integer.MIN_VALUE是它自己的负值,Long.MIN_VALUE也是一样。对这两个值取负值将会产生溢出,但是Java在整数计算中忽略了溢出。其结果已经阐述清楚了,即使它们并不总是你所期望的。
下面的声明将使得布尔表达式(i != 0 && i == -i)的计算结果为true,从而使循环无限环绕下去:
int i = Integer.MIN_VALUE;
下面这个也可以:
long i = Long.MIN_VALUE;
如果你对取模运算很熟悉,那么很有必要指出,这个谜题也可以用代数方法解决。Java的int算术运算是实际的算术运算对232取模的运算,因此本谜题需要一个对这种线性全等的非0解决方案:
i ≡ -i(mod 232)
将i加到恒等式的两边,我们可以得到:
2i ≡ 0(mod 32)
对这种全等的非0解决方案就是 i = 231。尽管这个值不能表示成为一个int,但是它是和-231全等的,即与Integer.MIN_VALUE全等。
总之,Java使用2的补码的算术运算,它是非对称的。对于每一种有符号的整数类型(int、long、byte和short),负的数值总是比正的数值多一个,这个多出来的值总是这种类型所能表示的最小数值。对Integer.MIN_VALUE取负值得到的还是它没有改变过的值,Long.MIN_VALUE也是如此。对Short.MIN_VALUE取负值并将所产生的int数值转型回short,返回的同样是最初的值(Short.MIN_VALUE)。对Byte.MIN_VALUE来说,也会产生相似的结果。更一般地讲,千万要当心溢出:就像狼人一样,它是个杀手。
2
0
分享到:
评论
1 楼 liuming 2009-02-20  
个人看法:觉得那本书有些词用得太生硬,原文要是iterator的话,觉得译成迭代器会比较好些。

相关推荐

    c++狼人杀 c++狼人杀

    c++狼人杀c++狼人杀c++狼人杀c++狼人杀c++狼人杀c++狼人杀c++狼人杀c++狼人杀c++狼人杀c++狼人杀c++狼人杀c++狼人杀c++狼人杀c++狼人杀c++狼人杀c++狼人杀c++狼人杀c++狼人杀c++狼人杀c++狼人杀c++狼人杀c++狼人杀...

    c++狼人杀 c++狼人杀.zip

    在C++狼人杀项目中,开发者需要熟练掌握C++的基本语法,包括变量、数据类型、控制结构(如循环、条件语句)、函数、类和对象等。 2. **面向对象编程(OOP)**:狼人杀游戏涉及到多个游戏角色,每个角色有自己的属性...

    狼人杀游戏源码

    此外,可能还有工厂模式用于创建角色对象,策略模式用于实现角色的不同行为,观察者模式用于监听游戏状态变化并通知相关组件。 六、测试与调试 为了让游戏运行稳定,源码必须经过严格的测试。开发者可能使用单元...

    微信小程序 小游戏类 狼人杀 (源代码+截图)

    微信小程序 小游戏类 狼人杀 (源代码+截图)微信小程序 小游戏类 狼人杀 (源代码+截图)微信小程序 小游戏类 狼人杀 (源代码+截图)微信小程序 小游戏类 狼人杀 (源代码+截图)微信小程序 小游戏类 狼人杀 (源...

    C/C++狼人杀框架代码

    7. **代码组织与设计模式**:遵循良好的编程实践,如使用设计模式(如工厂模式、观察者模式等),可以使代码更易于理解和维护。C++支持多种设计模式,可以提高代码的复用性和扩展性。 8. **测试**:为了确保游戏的...

    c++狼人杀小游戏案例

    c 狼人杀

    c++狼人杀.docx

    首先,我们定义了一个枚举类型`Role`,用于表示游戏中不同的角色,包括无人(NONE)、平民(HUMAN)、村民(VILLAGER)、女巫(WITCH)、狼人(WEREWOLF)以及揭示者(REVEAL)。枚举类型在C++中是一种强大的工具,...

    狼人杀法官台词及统计表格.pdf

    狼人杀法官台词及统计表格.pdf 狼人杀是一款非常流行的桌面游戏,游戏中法官台词和统计表格是游戏进行的关键组件。以下是对狼人杀法官台词及统计表格的详细解释: 游戏流程 游戏开始时,法官会宣布天黑,请闭眼,...

    狼人杀微信娱乐游戏小程序源码

    2. **JavaScript编程基础**:理解变量、函数、条件语句、循环等基本概念。 3. **HTML和CSS基础**:能读懂WXML和WXSS,理解DOM操作和CSS布局。 4. **源码阅读和理解能力**:能够分析源码结构,理解游戏逻辑和数据流程...

    C++实现狼人杀简易版

    C++实现狼人杀简易版

    微信小程序狼人杀小游戏

    微信小程序狼人杀小游戏是一款基于微信平台开发的社交娱乐应用,它将经典的狼人杀桌面游戏移植到了移动端,让用户在微信环境下即可体验到紧张刺激的推理与辩论乐趣。这款小游戏的特点在于其便捷性,用户无需下载安装...

    C++狼人杀网络游戏开发

    开发过程中,开发者可能运用了一些设计模式,如工厂模式用于创建角色实例,观察者模式用于游戏状态的更新通知。同时,为了调试和优化,可能会有日志系统记录服务器和客户端的运行情况。 总之,这个项目展示了如何...

    狼人杀工程素材与源码 Unity FairyGUI

    通过研究这个项目,初学者可以了解到Unity中的基本操作,如场景管理、对象实例化、组件交互等;而对于有一定经验的开发者,他们可以学习到如何结合FairyGUI来优化UI流程,提高开发效率。此外,此项目还能帮助开发者...

    c++狼人杀终极版.cpp

    c++狼人杀终极版.cpp

    狼人杀虫洞连麦技术

    ### 狼人杀虫洞连麦技术解析 随着狼人杀游戏的火爆,其背后的技术支持也成为了人们关注的焦点。尤其是对于依赖实时语音交流的游戏来说,如何提供高质量、低延迟的连麦体验,成为了提升用户体验的关键。本文将深入...

    小程序+狼人杀游戏+源码程序

    【小程序+狼人杀游戏+源码程序】是一款基于微信小程序平台开发的在线狼人杀游戏应用。这个项目包括了完整的源代码,开发者可以借此学习和理解如何利用小程序技术构建一款社交互动的游戏应用。 首先,我们要了解小...

    狼人杀统计系统

    "狼人杀统计系统"是一个基于Java Web技术的在线游戏战绩统计平台,它结合了即时通讯功能,为玩家提供了一种记录和分析狼人杀游戏成绩的工具。系统使用jsp和servlet作为主要的后端开发语言,利用MySQL作为数据库存储...

    狼人杀小程序源码

    2. **数据绑定与事件处理**:在 WXML 中,通过 `wx:if`、`wx:else` 和 `wx:for` 等指令进行条件渲染和循环。数据绑定使用双大括号 `{{ }}`,将后台数据与前端视图关联起来。事件处理通过 `bindtap` 等事件监听器实现...

    C++程序设计:狼人杀网络游戏开发完整源码.zip

    《C++程序设计:狼人杀网络游戏开发》 在计算机编程领域,C++是一种强大而高效的语言,尤其适合开发复杂的系统,如网络游戏。本项目"狼人杀网络游戏开发"是用C++语言编写的,利用Microsoft Foundation Classes (MFC...

    狼人模型3dmax

    《狼人模型3dmax:细致入微的三维创作与动画制作详解》 在数字艺术领域,3D建模和动画制作是至关重要的技术之一,而"狼人模型3dmax"则是这样的一个实例,展示了如何利用3ds Max这一强大工具来创造出栩栩如生的角色...

Global site tag (gtag.js) - Google Analytics