Java 为什么循环使用字符作为';s指数循环无限大?
此循环将无限期地继续:Java 为什么循环使用字符作为';s指数循环无限大?,java,loops,char,Java,Loops,Char,此循环将无限期地继续: char a = 100; for(a=100; a>=0;--a) System.out.println(a); 发生这种情况是因为a在算术运算中被提升为int值,并从16位字符值扩展到32位,因此始终保持正值 没有char值是无符号的-当它们低于0时,返回到65535 用byte交换char——然后它就会工作。它确实会无限循环——你所说的原因很接近。之所以发生这种情况,是因为a不能表示任何不满足a>=0-char无符号的数字。算术下溢在Java中定义良
char a = 100;
for(a=100; a>=0;--a)
System.out.println(a);
发生这种情况是因为a在算术运算中被提升为int值,并从16位字符值扩展到32位,因此始终保持正值 没有
char
值是无符号的-当它们低于0时,返回到65535
用
byte
交换char
——然后它就会工作。它确实会无限循环——你所说的原因很接近。之所以发生这种情况,是因为a
不能表示任何不满足a>=0
-char
无符号的数字。算术下溢在Java中定义良好且未指示。请参见本规范的以下相关部分
-
整数运算符不以任何方式指示溢出或下溢
这意味着除了比较数值外,没有溢流/下溢的迹象。。。e、 g.如果像其他人所说的那样
,Java中的a
类型是无符号的,因此char
将始终为真。当a>=0
达到0并再次递减时,它变为65535。如果您只是想反常,可以这样编写循环以在101次迭代后终止:a
char a = 100; for(a=100; a<=100;--a) System.out.println(a);
chara=100;
对于(a=100;aIs)这真的是算术下溢吗?cf.你仍然错了。整数下溢确实发生在Java中。只是没有指出……正如你引用的JLS文本所述。也就是说,没有引发异常,也没有什么可以直接测试是否发生了下溢。@oldrinb-这只回答了问题“会的。”更有趣的问题是“为什么”。@StephenC我的评论回答了标题中的问题。“为什么”我在下面回答。@Phoenix我更新了我的回答,事实上你的回答是对的,原因…:-)斯蒂芬,你说得对。我假设它像C的字符。@NickODell那么你应该知道,纯
的符号是由实现定义的……它只能保证能够适应整个ASCII字符集(0-127),C99确保它至少可以存储8位。oldrinb,在C语言中,我总是澄清一个变量是有符号的还是无符号的,只是为了确保它在所有编译器上都能正常工作。这是必要的,即使是int之类的,还是偏执?NickODell no--char
对应于int
,signed int
到long
,和signed long int
到short
。区别出现在signed short int
上,因为从技术上讲,普通char
、char
和signed char
都是独立的数据类型。unsigned char