http://www.dewen.net.cn/q/15807/java byte 疑问

http://www.dewen.net.cn/q/15807/java byte 疑问

罢巴
1 票
罢巴 252
看的是 java7 入门经典,第58页有一个关于byte类型变量初始化的问题,希望将一个byte变量 allBitsOne 的每一位都初始化为1

byte allBitsOne = 0xFF; //这个就是错的,书里说的原因是 0xFF 这个字面量表示的是十进制的,超出了byte类型的表示范围,好吧这个就算理解了,所以我试了这样
byte allBitsOne = (byte)0xFF; //果然是可以的,成功截去了高位,现在 allBitsOne 的每一位都是1了

//但是书里紧接着跟着这么一个例子
byte allBitsOne = 0xFFFFFFFF; //然后说这样就可以达到每位是1的效果,我试了,是可以的,但是我的疑问就是,为什么这样就可以,这个不是更加超出了byte类型所能表示的范围了吗?

评论 (0) • 举报 (0) • 分享 • 链接 • 2013-12-23 
添加评论...
1个答案 票 数
brayden认证专家
1 票
brayden6562
这个问题挺有意思的. 看了下SOF上的回答, 是因为:

byte能表示的范围为 -128 ~ 127; 而0xFF 为 int 256, 所以必须做强制转换; 0xFFFFFFFF 为 int -1, 反而是在byte的数值范围内, 所以编译器不会报错.

/** 128 和 -129 刚好超出 byte的表示范围. */
byte a = 128; //0x00000080, compiler error.
a = -129; //0xFFFFFF7F, compiler error.

/** 在 byte的表示范围内 */
a = 127; //0x0000007F
a = -128; //0xFFFFFF80
a = -1; //0xFFFFFFFF

java编译器错误为:
Type mismatch: cannot convert from int to byte
说实话, 这个挺误导的, 最好说清楚是byte数值范围的问题.

posted @ 2016-03-10 15:30  brayden  阅读(119)  评论(0编辑  收藏  举报