跳转至

二进制

前置知识

十进制

目标

十进制、二进制、八进制、十六进制之间的转换

有符号、无符号

二进制

数字电子电路中,逻辑门直接采用了二进制,因此现代的计算机和依赖计算机的设备里都用到二进制。每个数字称为一个比特(二进制位)或比特(Bit,Binary digit 的缩写)

十进制转二进制,短除法

img

十六进制

十六进制,简写hex,在数学中是一种逢 16 进 1 的进位制。一般用数字 0 到 9 和字母 A 到 F 来表示。

在计算机领域,因为将 4 个比特(Bit)化成单独的 16 进制数字不太困难。

1个字节(Byte)可以表示成 2 个连续的 16进制数字。

可是,这种混合表示法容易令人混淆,因此需要一些前缀、后缀或者下标来显示。

表示方式

使用前缀0x”,例如0x3F”。
开头的0令解析器更易辨认数,“x则代表十六进制。(“x可以大写也可以小写

十六转二,二转十六

十六进制转二进制就是一位对四位反之亦然
八进制转二进制就是一位对三位反之亦然

有符号数、无符号数

若采用现代 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` 是有符号还是无符号由实现决定。

// 关键词:拓展、截断
[2021年普及组初赛]
输出 int(char(0xff)),输出-1
如果是输出 `int(static_cast<unsigned char>(0xff))`,输出 255

总结

十进制、二进制、八进制、十六进制之间的转换

有符号、无符号

参考

wikipedia

IBM Documentation

unsigned char_百度百科

信息学奥赛-NOIP-少儿编程培训-有道小图灵

《算法进阶指南》