小编典典
Java实际上没有无符号原语。
值127实际上由“ 01111111”表示,第一位是符号(0为正)。
一个无符号字节将能够保存0到255的值,但是127是有符号字节的最大值。由于一个字节有8位,有符号的一个消耗1来保存符号。因此,如果要表示大于127的值,则需要使用具有更大位数的更大类型。较大的类型也有一个符号保留位,但是它至少有8位用于实际值,因此可以表示值255。
话虽如此,您可能应该避免使用byte和short,因为它们存在问题。您会注意到我将结果强制转换为short,因为运算符实际上返回了int。您应该只在int和long中坚持使用Java,因为它们实现得更好。
编辑:由于符号位是short的第一位,所以AND运算符使其无符号,然后将保存字节值的8位复制到short的后8位。因此,如果您有一个负数,则第一个为1的位(这意味着它为负数)实际上成为该值的一部分。短路将始终为正,因为其符号位处于受短路影响的2的幂的2的高位。
byte: 10101101
|||||||
short: 0000000010101101
|||||||||||||||
编辑2:但是请注意,由于负值使用二进制补码表示,因此该值可能不是您期望的值。所有正值都保持不变。
但是-128 = 0x10000000将变为128
-127 = 0x10000001将变为129
依此类推,直到-1 = 0x11111111将变为255
2020-11-16