James Gosling解释了为什么Java的字节被签名

pol*_*nts 50 java byte types language-design

我最初感到惊讶的是Java决定指定byte签名,范围从-128..127(包括).我的印象是,大多数8位数字表示都是无符号的,0..255而是一系列的(例如,以点十进制表示的IPv4).

那么詹姆斯·戈斯林有没有被要求解释为什么他决定byte签署?过去权威程序设计语言设计师和/或评论家之间是否就此问题进行了明显的讨论/辩论?

Boz*_*zho 28

似乎简单是主要原因.从这次采访中:

Gosling:对于我作为一名语言设计师而言,我现在并不像以前那样真实地认为,"简单"真正意义上的结果是我可以期待J. Random Developer在他的脑海中保留这个规范.这个定义说,例如,Java不是 - 实际上很多这些语言都有很多极端情况,这些都是没人真正理解的.测试任何C开发人员关于unsigned的问题,很快你就会发现几乎没有C开发人员真正理解无符号算法是什么,无符号算术是什么.这样的事情让C变得复杂.我认为Java的语言部分非常简单.你必须查找的库.

我最初的假设是因为Java根本没有无符号数字类型.为什么要byte成为例外?char是一个特例,因为它必须代表UTF-16代码单元(感谢Jon Skeet的报价)

  • 从4.2节开始:数值类型是整数类型和浮点类型.整数类型是byte,short,int和long,其值分别为8位,16位,32位和64位二进制补码整数,以及char,其值为16位无符号整数代表UTF-16代码单元(§3.1). (10认同)
  • 我明白为什么他们可以为int执行此操作但是不是无符号字节o到255更简单? (5认同)
  • 除了`char`. (3认同)
  • @unbeli:它是语言规范中的数字类型。 (3认同)
  • @Roman:关于`byte`级别操作,我观察到很多关于stackoverflow的问题(Bloch建议也许正好因为......); 由于符号扩展,他们因为正确而变得非常棘手.幸运的是,大多数这些都可以隐藏在库中,但如果语言元素本身并不那么棘手,那将会很好. (2认同)
  • “`char` 是一个特殊情况”。嗯,‘字节’不是吗? (2认同)

Fav*_*ius 14

根据'Oak Language Specification 0.2'又称Java语言:

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

你可以从这里获取一个postscript副本:

http://cretesoft.com/archive/files/OakSpec0.2.ps(上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开发人员关于unsigned的问题,很快你就会发现几乎没有C开发人员真正理解无符号算法是什么,无符号算术是什么.这样的事情让C变得复杂.我认为Java的语言部分非常简单.你必须查找的库.

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

曾经的橡树...... Heinz Kabutz,2003年7月15日

...为了填补我的Java历史空白,我开始在Sun的网站上挖掘,并最终偶然发现了Oak语言规范的Oak版本0.2.Oak是现在通常称为Java的原始名称,本手册是Oak(即Java)最早的手册....无符号整数值(第3.1节)

规范说:"四个整数类型的宽度分别为8,16,32和64位,并且除非带有unsigned修饰符作为前缀,否则都是有符号的.

在侧边栏中,它说:"未签名尚未实施;它可能永远不会." 你是对的."*


pol*_*nts 6

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

错误ID:4186775:请求无符号整数类型,尤其是 无符号byte

:11-已关闭,无法修复,请求增强

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

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

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

  • 它认为当关闭错误时,投票计数变为零. (3认同)
  • 哇,RFE 中有很多激烈的讨论。推荐阅读。 (2认同)