1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
| | 十进制 (Dec) | 二进制 (Bin, 8位) | 十六进制 (Hex) | | --------- | ------------- | ---------- | | 0 | 00000000 | 0x00 | | 1 | 00000001 | 0x01 | | 2 | 00000010 | 0x02 | | 3 | 00000011 | 0x03 | | 4 | 00000100 | 0x04 | | 5 | 00000101 | 0x05 | | 6 | 00000110 | 0x06 | | 7 | 00000111 | 0x07 | | 8 | 00001000 | 0x08 | | 9 | 00001001 | 0x09 | | 10 | 00001010 | 0x0A | | 11 | 00001011 | 0x0B | | 12 | 00001100 | 0x0C | | 13 | 00001101 | 0x0D | | 14 | 00001110 | 0x0E | | 15 | 00001111 | 0x0F | | 16 | 00010000 | 0x10 | | 17 | 00010001 | 0x11 | | 18 | 00010010 | 0x12 | | 19 | 00010011 | 0x13 | | 20 | 00010100 | 0x14 | | 32 | 00100000 | 0x20 | | 64 | 01000000 | 0x40 | | 128 | 10000000 | 0x80 | | 255 | 11111111 | 0xFF |
👉 规律记忆:
1 个十六进制位 (0~F) = 4 个二进制位
2 个十六进制位 (00~FF) = 1 个字节 (8 bit)
常用的 0x0A=10, 0x10=16, 0x40=64, 0x80=128, 0xFF=255
十六转十:高位乘以16+低位
1️⃣ 有符号 Byte 的表示
总共有 8 位二进制:
b7 b6 b5 b4 b3 b2 b1 b0
b7 是 符号位(最高位)
0 → 正数
1 → 负数
b6~b0 是数值位(7 位)
范围:-128 ~ 127
最小值:1000 0000 → -128
最大值:0111 1111 → 127
2️⃣ 二进制例子 十进制 二进制(8位) 说明 0 0000 0000 中性值 1 0000 0001 正数 127 0111 1111 最大正数 -1 1111 1111 负数(补码表示) -128 1000 0000 最小负数
“无符号”是二进制和计算机数据里一个非常重要的概念 1️⃣ 有符号数 vs 无符号数 ✅ 有符号整数(Signed)
可以表示 正数、负数和零
例如 8 位(1 个字节):
范围:-128 ~ 127
第一位是 符号位:
0 = 正数
1 = 负数
✅ 无符号整数(Unsigned)
只能表示 非负数(0 或正数)
例如 8 位:
范围:0 ~ 255
所有 8 位都用来表示数值,没有符号位
因此最大值比有符号数大了一倍
2️⃣ 为什么要用无符号?
有些硬件或协议数据永远不会为负,比如:
电压值、温度传感器、PWM占空比
设备计数器、PID 输出值
使用无符号数可以 表示更大的范围,同样字节数存更多信息
3️⃣ 举例 类型 二进制 十进制 有符号 Int8 11111111 -1 无符号 UInt8 11111111 255
同样一个字节,解释方式不同,数值完全不同。
4️⃣ 在 Kotlin 里
Kotlin 没有原生 UInt16/UInt32(早期版本),所以我们用 Int 或 Long + 位运算 来表示无符号数:
val value = ((this[offset].toInt() and 0xFF) or ((this[offset+1].toInt() and 0xFF) shl 8))
and 0xFF 就是把 字节转成无符号
避免 Kotlin Byte 被当作 -128~127 的有符号数
5️⃣ 一句话总结
无符号整数 = 永远 ≥0,没有负数,最大值比同样字节数的有符号数大一倍。
|