字节序 (Endianness) 面向 多字节数值类型 (Int16, Int32, Int64) 定义
- 小端(littleEndian): 多字节数值类型的数值低位存储在内存低位,小端易存取易计算,多用于存储
- 大端(bigEndian): 数值低位存储在内存高位,大端易阅读,多用于网络传输
// iOS字节序是小端
withUnsafeBytes(of: UInt32(0x01_02_03_04)) { p in
p.forEach { byte in
print(byte) // 4 3 2 1
}
}
// 转为大端
withUnsafeBytes(of: UInt32(0x01_02_03_04).bigEndian) { p in
p.forEach { byte in
print(byte) // 1 2 3 4
}
}
整数类型 | 十进制 | 二进制 | 原码 | 反码 | 补码 | 计算机中实际的记录 |
Int | 3 | 0011 | | | | 0011 |
Int | -3 | -0011 | 1011 | 1100 | 1101 | 1101 |
UInt | 3 | 0011 | | | | 0011 |
withUnsafeBytes(of: 3) { p in
print(String(p[0], radix: 2)) // 00000011
}
withUnsafeBytes(of: -3) { p in
print(String(p[0], radix: 2)) // 11111101
}
浮点数类型 | 十进制 | 二进制 | 科学计数 | 阶数 | 尾数 | 计算机中实际的记录 |
Float | 3.625 | 11.101 | 1.1101 * 2^1 | 1 + 01111111 | 1101 | 0100000001101 |
Float | -3.625 | -11.101 | -1.1101 * 2^1 | 1 + 01111111 | 1101 | 1100000001101 |
Double | 3.625 | 11.101 | 1.1101 * 2^1 | 1 + 01111111111 | 1101 | 0100000000001101 |
Double | -3.625 | -11.101 | -1.1101 * 2^1 | 1 + 01111111111 | 1101 | 1100000000001101 |
withUnsafeBytes(of: Float(3.625)) { p in
print(String(UInt16(p[3]) << 8 + UInt16(p[2]), radix: 2)) // 0100000001101000
}
withUnsafeBytes(of: Float(-3.625)) { p in
print(String(UInt16(p[3]) << 8 + UInt16(p[2]), radix: 2)) // 1100000001101000
}
withUnsafeBytes(of: 3.625) { p in
print(String(UInt16(p[7]) << 8 + UInt16(p[6]), radix: 2)) // 0100000000001101
}
withUnsafeBytes(of: -3.625) { p in
print(String(UInt16(p[7]) << 8 + UInt16(p[6]), radix: 2)) // 1100000000001101
}