跳转至

二进制

前置知识

十进制

目标

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

有符号、无符号

二进制

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

十进制转二进制,短除法

img

十六进制

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

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

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

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

表示方式

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

十六转二,二转十六

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

有符号数、无符号数

用来表示有符号数,数的范围就是 \(-(2^{n - 1} - 1)\)\(2^{n-1} - 1\) 。当 \(n = 8\) 时, 这个范围就是 \(-127\)\(+127\)

在不需要考虑数的正负时,就不需要用一位来表示符号位,n 位机器数全部用来表示数值,这是表示数的范围就是 到 \(0\)\(2^n - 1\) 。当 \(n = 8\) 时,这个范围就是 \(0\)\(255\)

int x; // 有符号整型,占4个字节,32位,[-2147483648, 2147483647]
usigned int x; // 无符号整型,占4个字节,32位,[0, 4294967295]

char c; // 有符号字符类型,占1个字节,8位,[-128, 127]
unsigned char c; // 无符号字符类型,占1个字节,8位, [0, 255]

unsigned char 在计算机中使用补码存储
unsigned char c = 0xF7;
c 在计算机中存储的方式为:11110111

int/unsigned int 变量赋值给 unsigned char
变量是会发生字节截断(9位和高于9位的将被程序自动丢弃)
unsigned int a = 0xFFFFFFF7;
unsigned char b = (unsigned char)a;
此时b的值为 0xF7

对于(signed)char来说,0x80用二进制表示为1000 0000,
当它作为char赋值给unsigned int或 int 时,系统认为最高位是符号位,会对最高位进行扩展。
而0x7F用二进制表示为0111 1111,最高位为0,不会扩展。

对于unsigned char来说,不管最高位是0,还是1,都不会做扩展。

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

总结

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

有符号、无符号

参考

wikipedia

IBM Documentation

unsigned char_百度百科

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

《算法进阶指南》