原文:
If you are converting from a byte value b to a char and you don’t want sign
extension, you must use a bit mask to suppress it. This is a common idiom, so no
comment is necessary:
char c = (char) (b & 0xff);
没有get到 sign extension的含义!以及为什么这么做就没有sign extension
首先char是16位 byte是8位 byte有负数形式 char没有 如果直接做移位 负数的byte会直接根据首位的符号位1直接扩展 变成111111111xxxxxx形式 而做位与则不会出现这个问题
我理解是符号位
进行位操作时,除long型外,其他类型会自动转成int型. don’t want sign extension 意味这不把byte首位做符合位来转char,java不存在无符号类型,char范围为-2^16-2^16-1,char为两个字节,比如byte b=-1,把首位当符号位char c=(char)b,则c二进制位(补码)表示为1111 1111 1111 1111 即-1,两个字节表示-1;如果不把首位做符号位,如char c=(char)(b&0xff),则c的二进制位(补码)表示为0000 0000 1111 1111 即255,两字字节表示255.