int轉(zhuǎn)byte
在java中,寬類型(wider integer type)轉(zhuǎn)窄類型(narrower type)會(huì)直接將高位的字節(jié)截?cái)唷R虼?,只要寬類型的?shù)據(jù)可以被壓縮成窄類型,值就不會(huì)變。比如 int的127轉(zhuǎn)成byte后,值仍然是127。而當(dāng)int的值超出了byte的范圍(-128~127),則會(huì)發(fā)生溢出。比如int的128轉(zhuǎn)成byte后的值不是最接近它的127,而是-128。
分析
當(dāng)int轉(zhuǎn)byte時(shí),高位的數(shù)據(jù)全部被截?cái)啵?28被截?cái)嗪缶褪?0000000,而byte類型是有符號(hào)的,因此,128轉(zhuǎn)換后的結(jié)果肯定是個(gè)負(fù)數(shù)。熟悉二進(jìn)制補(bǔ)碼運(yùn)算的都知道,負(fù)數(shù)求值為取反后加1,因此10000000的值為01111111(127) + 1 = 128,因此結(jié)果是-128。
當(dāng)int的值超過(guò)256后,低位的值則都是0。此時(shí)轉(zhuǎn)換成byte后的值則恒定為0。
最后列出一個(gè)可以幫我們計(jì)算轉(zhuǎn)換值的簡(jiǎn)單算法:
int byteValue;
int temp = intValue % 256;
if ( intValue < 0) {
byteValue = temp < -128 ? 256 + temp : temp;
} else {
byteValue = temp > 127 ? temp - 256 : temp;
}