作者回复: > 为什么byte和short后面不用加字母呢?
是的, 编译器可以检查byte和short的值阈, 如果超出会报错. 比如
byte b = 999;
这个更多的是Java编译器从易用性做的一种简化. 如果每次给byte和short赋值, 都要标明一下类型, 会很繁琐.
> 后面的问题...
其实不存在long的值包含在int里面, 比如
long abc = 999;
这个过程其实是一种Java的自动类型转换, 低精度的数字可以赋值给高精度的数字. 这部分内容在"15 | 基本数据类型的更多语法点"有讲述.
作者回复: 缺省值,default 值,默认值三个词是一个意思。代表某种数值类型的......默认值。
作者回复: 跟我读:参数,英文名parameter。第二篇我们会详细讲述的。对于这些内容,第一篇混个手熟眼熟就好。关注点放在main函数里面的代码哈
作者回复: 1.两个byte组成,第一位是符号位那应该是2的15次方,也就是3w多?
char是无符号数。所以还是六万多。
2.从char的存储层面理解是指char能表示0到6w多内的任意字符吗?
指char的存储层面就是两个byte,两个byte能代表无符号数6w多个。所以char可以利用这六万多个数,表示六万多个字符。
作者回复:
这个不是四舍五入的范畴,而是计算机里的浮点数(不止是Java)无法精确表示每一个小数的问题。详细参见
https://github.com/deepnighttwo/LetsJava/blob/master/FAQ/01%E7%AB%A0-%E4%B8%BA%E4%BB%80%E4%B9%88%E8%AE%A1%E7%AE%97%E6%9C%BA%E9%87%8C%E7%9A%84%E6%B5%AE%E7%82%B9%E6%95%B0%E4%B8%8D%E7%B2%BE%E7%A1%AE.md
作者回复: 你说的应该是类似这种写法:
long longVal = 12345678987621L;
这确实不是一种省心的写法。Java确实也可以做到让语句更简洁。没有做,是因为Java想让程序员更清楚的认识到自己用的是什么类型的值。
literal value是literal value, 变量longVal是变量longVal只是赋值语句把它们连了起来。
数值后面加个L,代表这个literal value是long类型。那么值域就可以是long的值域。默认的数值的literal value是int类型,只有加了L,才会被Java当成是long类型。不加L,12345678987621超出了int的值域,就会报错。
作者回复: 谢谢补充
作者回复: double的问题在于无法精确的比较。而且有些场景可能会出现精度问题,比如本来应该是3,结果double变成了2.9999999999这都是有可能的。
由此造成的问题就是,要比较两个double的值很繁琐,要用两个double的数字相减,然后看差值的绝对值是不是小于一个对于业务足够可以忽略。比如对于表示钱的两个double数字,差的绝对值如果小于0.001,也就是一厘,那就可以认为是相等的。
如果业务上是整数,尽量用int或者long。比如表示手机的个数,汽车的个数等。
作者回复: 这个是从两个方面理解,首先是从char的本意。char的本意是要表示一个字符,只要是计算机里有的字符,char都能表示。
最多6万多个,是从char的存储层面理解。char是两个byte组成的,所以最多也就只能表示6万多个数字,也就是最多只能表示六万多个字符。当然我们也不用担心这个事情,六万多个是足够我们用了的。