byte或short类型在左移时应注意的问题
时间:2010-10-17 来源:juxiangwu
package com.kkoolerter.jdk;
/**
* 位移(ByteShift)
* @author Jenson
*
*/
public class ByteShift {
public static void main(String[] args) {
byte a = 64,b;
int i = a << 2;
b = (byte)(a<<2);
System.out.println("a的原始值:a="+a);
System.out.println("i="+i+",b="+b);
/*
*这个程序段说明了Java在对shot的byte类型进行位移时,将会产生出人
*意料的结果。因为对一个表达式求值 时,byte和short将自动 提升为int
*类型,表达式结果也是一个int类型。也就是byte或short值向左移位的
*结果是一个int,但移到左边的位超过了第31位将丢失。此外,负的byte
*或short值在提升为int时,其符号将扩展,高阶位将用1来填充。为此
*在一个byte或short上执行一个左移则会丢弃int结果的最高阶位。例如,
*如果左移一个byte值,该值首先被提升为int,然后再在int上执行一个
*左移。此时,如果需要的一个移位后的byte值,则必须丢弃结果中的前3
*个字节,方法是将结果强制转换为byte类型。
*/
}
}
/**
* 位移(ByteShift)
* @author Jenson
*
*/
public class ByteShift {
public static void main(String[] args) {
byte a = 64,b;
int i = a << 2;
b = (byte)(a<<2);
System.out.println("a的原始值:a="+a);
System.out.println("i="+i+",b="+b);
/*
*这个程序段说明了Java在对shot的byte类型进行位移时,将会产生出人
*意料的结果。因为对一个表达式求值 时,byte和short将自动 提升为int
*类型,表达式结果也是一个int类型。也就是byte或short值向左移位的
*结果是一个int,但移到左边的位超过了第31位将丢失。此外,负的byte
*或short值在提升为int时,其符号将扩展,高阶位将用1来填充。为此
*在一个byte或short上执行一个左移则会丢弃int结果的最高阶位。例如,
*如果左移一个byte值,该值首先被提升为int,然后再在int上执行一个
*左移。此时,如果需要的一个移位后的byte值,则必须丢弃结果中的前3
*个字节,方法是将结果强制转换为byte类型。
*/
}
}
相关阅读 更多 +