《Java puzzlers》里关于 sign extension 的示例

原文:
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

阅读 2.7k
3 个回答

首先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.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题