【问题标题】:James Gosling's explanation of why Java's byte is signedJames Gosling 解释为什么 Java 的字节是有符号的
【发布时间】:2010-06-24 08:27:52
【问题描述】:

我最初对 Java 决定指定 byte 已签名感到惊讶,其范围为 -128..127(含)。我的印象是大多数 8 位数字表示都是无符号的,取而代之的是 0..255 的范围(例如 IPv4 in dot-decimal notation)。

James Gosling 是否曾被要求解释为什么他决定签署byte?过去,权威的编程语言设计者和/或批评者之间是否就这个问题进行过显着的讨论/辩论?

【问题讨论】:

  • 好问题。这是一个真正无用的数据类型。
  • “我的印象是大多数 8 位数字表示都是无符号的......” 嗯,通常称为“字节”的那些是,是的。那些称为“char”的往往不是。高斯林想让所有东西都签名,这很公平,尽管我真的希望他给它换个名字,8位签名号码。 (但是,我真的希望他也有无符号的数字。)
  • 停止抱怨 Java 没有无符号字节,这不是问题。唯一的小不便是您需要将十六进制常量表转换为字节。其他一切见stackoverflow.com/questions/397867/…
  • @starblue 嗯?显然,您不必在 Java(解析器、编码器)中编写任何字节处理代码……这是一个主要的 PITA。也可能是性能问题,这取决于 jvm 如何能够优化强制转换(或不优化)。顺便说一句,关于符号扩展,问题甚至不仅限于字节,还包括短整型。
  • @starblue 尝试重构基于字节的通信协议的 Java 实现,然后告诉我无符号字节不是问题!噩梦更像

标签: java types language-design byte


【解决方案1】:

似乎简单是主要原因。来自this interview

Gosling:对于我作为一名语言设计师来说,我现在并不认为自己是这样的,“简单”最终的真正含义是我是否可以期望 J. Random Developer 将规范牢记在心。该定义表明,例如,Java 不是——事实上,这些语言中的许多最终都会出现很多极端情况,即没有人真正理解的事情。向任何 C 开发人员询问有关无符号的问题,很快你就会发现几乎没有 C 开发人员真正了解无符号的情况,无符号算术是什么。这样的事情使 C 变得复杂。我认为 Java 的语言部分非常简单。您必须查找的库。

我最初的假设是因为 Java 根本没有无符号数字类型。为什么byte 应该是一个例外? char 是一种特殊情况,因为它必须表示 UTF-16 代码单元(感谢 Jon Skeet 的引用)

【讨论】:

  • char 甚至不是数字,是吗?所以 char 既不是有符号的,也不是无符号的。
  • @unbeli:语言规范中的数字类型。
  • 从 4.2 节开始:数字类型是整数类型和浮点类型。整数类型有 byte、short、int 和 long,其值分别为 8 位、16 位、32 位和 64 位有符号二进制补码整数,以及 char,其值为 16 位无符号整数表示 UTF-16 代码单元(第 3.1 节)。
  • 我明白为什么他们可能会为 int 这样做,但不是更简单的无符号字节 o 到 255?
  • @Roman:我在 stackoverflow 上观察到许多关于byte 级别操作的问题(Bloch 建议反对的可能正是因为......);由于符号扩展,他们真的很难做到正确。幸运的是,其中大部分都可以隐藏在库中,但如果语言元素本身不那么棘手,那就太好了。
【解决方案2】:

我不知道 James Gosling 有任何直接引用,但有一个未签名的官方 RFE byte

Bug ID: 4186775: request unsigned integer types, esp. unsigned byte

状态:11-关闭,不会修复,请求增强

请扩展 Java 设计以允许无符号类型,尤其是 未签名byte

我一直想知道为什么 Java 中没有无符号整数类型。它 在我看来,对于byte-length 值来说,没有它是非常尴尬的 他们[...]

我知道这是 Java 开发人员做出的设计决定。 我不明白为什么。他们是否认为无符号整数类型是邪恶的 还是有害的,并选择保护我免受自己的伤害?

【讨论】:

  • 哇,RFE 中有很多激烈的讨论。推荐阅读。
  • 自 1998 年以来 RFE 的票数为 0,这让我感到非常惊讶。也许这对大多数人来说毕竟不是问题。
【解决方案3】:

根据“Oak 语言规范 0.2”又名 Java 语言:

“Oak 字节类型是 C 程序员习惯认为的 char 类型。但在 Oak 语言中,字符是 16 位宽。具有单独的字节类型消除了 C 中解释之间的混淆char 作为 8 位整数和字符。"

您可以从这里获取附言副本:

http://cretesoft.com/archive/files/OakSpec0.2.ps (partial copy on scribd)

本站还有一段采访内容:(他在为java中无符号字节的缺失辩护)

http://www.darksleep.com/player/JavaAndUnsignedTypes.html

添加从上述页面获取的采访...

*" http://www.gotw.ca/publications/c_family_interview.htm

问:程序员经常谈论的优缺点 用“简单的语言”编程。这句话是什么意思 您,您认为 [C/C++/Java] 是一种简单的语言吗?

里奇:[为简洁而删除]

Stroustrup:[为简洁而删除]

Gosling:对于作为语言设计师的我来说,这点我真的不算数 像现在这样的我自己,“简单”的真正含义是可以 我希望 J. Random Developer 将规范牢记在心。那 定义说,例如,Java 不是——事实上很多 这些语言最终会出现很多极端情况,没人能做到的事情 真的明白。对任何 C 开发人员进行关于未签名和漂亮的测验 很快你就会发现几乎没有 C 开发人员真正理解 继续无符号,无符号算术是什么。像这样的东西 使C复杂。我认为 Java 的语言部分很漂亮 简单的。您必须查找的库。

另一方面....根据http://www.artima.com/weblogs/viewpost.jsp?thread=7555

从前的橡树... 海因茨·卡布茨 2003 年 7 月 15 日

... 为了填补我对 Java 历史的空白,我开始挖掘 Sun 的网站,最终偶然发现了 Oak Language Oak 0.2 版规范。橡树是什么的原始名称 现在俗称Java,本手册是最古老的手册 可用于 Oak(即 Java)。 ... 无符号整数值(第 3.1 节)

规范说:“宽度为 8、16、32 的四种整数类型 和 64 位,并且是有符号的,除非以无符号修饰符为前缀。

在侧边栏中它说:“未签名尚未实现;它可能 永远不会。”你是多么正确。 "*

【讨论】:

    【解决方案4】:

    byte 没有理由不签名。当您使用 char 类型来表示字符时,byte 通常不会完成 char 的工作。

    【讨论】:

    • 我相信 Java 字符是 USC-2 并以 16 位/2 字节存储。即使不是这种情况,我也一直觉得它是一个丑陋的类型疣,c 没有本机字节类型(是的,我知道 char 是一个字节,但即使对于 c 来说,感觉类型玩得太松了)。
    • 在进行按位运算时,字节无符号的原因有很多。
    • 示例:这是真的还是假的?字节 b = (字节) 200; System.out.println(b > 100);要修复它,您需要以 & 0xFF byte b = (byte) 200; 结束几乎所有指令System.out.println((b & 0xFF) > 100 );此链接更详细地解释了原因:nayuki.eigenstate.org/page/javas-signed-byte-type-is-a-mistake
    • 签名的理由要少得多。尝试编写代码以将四个有符号字节的大端序列转换为“int”。现在对四个有符号字节做同样的事情。哪个更清楚?用作较大值的构建块的类型(通常是字节 - 尤其是在读取和写入文件时)应该是无符号的。让他们签名会让事情变得更复杂
    猜你喜欢
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 2014-03-12
    相关资源
    最近更新 更多