二进制¶
前置知识¶
十进制
目标¶
十进制、二进制、八进制、十六进制之间的转换
有符号、无符号
二进制¶
数字电子电路中,逻辑门直接采用了二进制,因此现代的计算机和依赖计算机的设备里都用到二进制。每个数字称为一个比特(二进制位)或比特(Bit,Binary digit 的缩写)
十进制转二进制,短除法¶

十六进制¶
十六进制,简写hex,在数学中是一种逢 16 进 1 的进位制。一般用数字 0 到 9 和字母 A 到 F 来表示。
在计算机领域,因为将 4 个比特(Bit)化成单独的 16 进制数字不太困难。
1个字节(Byte)可以表示成 2 个连续的 16进制数字。
可是,这种混合表示法容易令人混淆,因此需要一些前缀、后缀或者下标来显示。
表示方式
十六转二,二转十六
有符号数、无符号数¶
若采用现代 C++ 实现使用的二进制补码,n 位有符号整数的范围是 \(-2^{n-1}\) 到 \(2^{n-1}-1\)。当 \(n=8\) 时,范围是 \(-128\) 到 \(127\)。
在不需要考虑数的正负时,就不需要用一位来表示符号位,n 位机器数全部用来表示数值,这是表示数的范围就是 到 \(0\) 到 \(2^n - 1\) 。当 \(n = 8\) 时,这个范围就是 \(0\) 到 \(255\)
int x; // 有符号整型,占4个字节,32位,[-2147483648, 2147483647]
unsigned int x; // 常见环境中占4个字节,32位,[0, 4294967295]
signed char c; // 常见8位环境中的范围是[-128, 127]
unsigned char c; // 无符号字符类型,占1个字节,8位, [0, 255]
unsigned char 表示无符号二进制值,不需要“补码解释”
unsigned char c = 0xF7;
c 在计算机中存储的方式为:11110111
int/unsigned int 变量赋值给 unsigned char
转成 `unsigned char` 时,结果按 $2^N$ 取模,N 是 `unsigned char` 的位数(常见为 8)
unsigned int a = 0xFFFFFFF7;
unsigned char b = (unsigned char)a;
此时b的值为 0xF7
对于 `signed char` 来说,在常见的 8 位补码环境中,负值转换为 `int` 时会保持数值,机器层面通常表现为符号扩展。
而0x7F用二进制表示为0111 1111,最高位为0,不会扩展。
对于 `unsigned char` 来说,转换为 `int` 时保持其非负数值,机器层面通常表现为零扩展。普通 `char` 是有符号还是无符号由实现决定。
// 关键词:拓展、截断
总结¶
十进制、二进制、八进制、十六进制之间的转换
有符号、无符号
参考¶
《算法进阶指南》