shl*_*jmi 5 java unsigned byte
我想了解如何将有符号数转换为无符号数.
让我说我有这个:
byte number = 127; // '1111111'
Run Code Online (Sandbox Code Playgroud)
为了使它无符号,我必须选择"更大"的数据类型"short"并应用值为0x00ff的AND运算符.
short number2;
number2 = number & 0x00ff;
Run Code Online (Sandbox Code Playgroud)
为什么这个号码没有签名?
Java 实际上没有无符号原语。
值 127 实际上由“01111111”表示,第一位是符号(0 是正数)。
无符号字节可以保存 0 到 255 之间的值,但有符号字节的最大值为 127。由于一个字节有 8 位,有符号的位需要消耗 1 位来保存符号。因此,如果要表示大于 127 的值,则需要使用具有更多位数的更大类型。更大的类型还有一个保留的符号位,但它至少有 8 位用于实际值,因此您可以表示值 255。
话虽如此,您可能应该避免使用 byte 和 Short,因为它们存在问题。您会注意到我将结果转换为short,因为运算符实际上返回int。你应该只使用 java 中的 int 和 long,因为它们实现得更好。
编辑:AND 运算符使其无符号,因为符号位是短整型的第一位,并且您将保存字节值的 8 位复制到短整型的最后 8 位。因此,如果你有一个负数,第一位 1(这意味着它是负数)实际上成为该值的一部分。并且短路将始终为正,因为其符号位处于受短路影响的 2 的幂的两个高位。
byte: 10101101
||||||| <- actual value
short: 0000000010101101
||||||||||||||| <- actual value
Run Code Online (Sandbox Code Playgroud)
编辑 2:请注意,由于负值使用二进制补码表示,因此该值可能不是您所期望的。所有正值保持不变。
但是 -128 = 0x10000000 将变为 128
-127 = 0x10000001 将变为 129
依此类推,直到 -1 = 0x11111111 将变为 255
| 归档时间: |
|
| 查看次数: |
4614 次 |
| 最近记录: |