总览
一些自创的名词定义:
-
在内存中实际存储的值称为内存值。
-
内存值经过字节序转换后,以无符号形式写成的数值,称为内存数值。内存数值用来直观纯粹地反映内存值的样貌。
用二进制表示的内存数值称为内存二进制。
用十六进制表示的内存数值称为内存十六进制。
用八进制表示的内存数值称为内存八进制。
用无符号十进制表示的内存数值称为内存十进制。
-
平时直接看到的数值,代码里直接书写的数值等,称为真值。
转换过程一张图:
一些说明:
-
不妨认为真值这个概念还在数学范畴,有正、负、零的概念,还没有计算机科学范畴中有符号、无符号的概念。接下来,进入计算机科学范畴,你可以视之为有符号数或者无符号数。
-
负真值只能视作有符号数;非负真值既可以视作有符号数,又可以视作无符号数。
-
内存数值用来直观纯粹地反映内存值的样貌,所以它本身是完全无视符号位的,即将它视作无符号数。当我们的目的不是想要反映内存值样貌的时候,可将内存数值视作有符号数或者无符号数,并进行相应的转换得到对应的真值。
-
用不同进制表示一个数时,十六进制、八进制、二进制形式都是将数视作无符号形式,将符号位视作一个普通的数值位包含在内进行转换的,故转换成的十六进制、八进制、二进制形式都是无符号形式且只有无符号形式。将一个数转换为十进制时则不同,我们既可以将数视作无符号形式进行转换,也可以将数视作有符号形式进行转换。若将数视作无符号形式,则将符号位视作一个普通的数值位包含在内进行转换,转换成的十进制形式是无符号形式;若将数视作有符号形式,则符号位会被真的视作符号位进行转换,转换成的十进制形式是有符号形式。
即,只存在以下说法:
以无符号十六进制形式打印内存数值。(打印内存十六进制)
以无符号八进制形式打印内存数值。(打印内存八进制)
以无符号二进制形式打印内存数值。(打印内存二进制)
以无符号十进制形式打印内存数值。(打印内存十进制)
以有符号十进制形式打印内存数值。
从真值到内存(写)
> 真值一
真值:+1
» 有符号
原码:0,000 0000 0000 0000 0000 0000 0000 0001
反码:0,000 0000 0000 0000 0000 0000 0000 0001
补码:0,000 0000 0000 0000 0000 0000 0000 0001
内存二进制:0000 0000 0000 0000 0000 0000 0000 0001
内存十六进制:0x00 00 00 01
» 无符号
内存二进制:0000 0000 0000 0000 0000 0000 0000 0001
内存十六进制:0x00 00 00 01
> 真值二
真值:-1
» 有符号
原码:1,000 0000 0000 0000 0000 0000 0000 0001
反码:1,111 1111 1111 1111 1111 1111 1111 1110
补码:1,111 1111 1111 1111 1111 1111 1111 1111
内存二进制:1111 1111 1111 1111 1111 1111 1111 1111
内存十六进制:0xff ff ff ff
» 无符号
真值 -1 无法看成无符号数。
但是举一个用无符号数存储 -1 的例子如下:
1
2
unsigned a = -1;
printf("a: %u\n", a); // 4294967295,即 2^32 - 1。
可以这样理解:
»> 写
-1 本身只能看成有符号数,此处作为 int
类型的常量存储。
内存二进制:1111 1111 1111 1111 1111 1111 1111 1111
存入内存。
»> 赋值
上述内存二进制被赋值给变量 a
。
»> 读
变量 a
是无符号数,所以其内存二进制被解释成无符号数,直接转换为真值,即 $2^{32}-1$。
从内存到真值(读)
> 内存值一
内存二进制:0000 0000 0000 0000 0000 0000 0000 0001
» 有符号
补码:0,000 0000 0000 0000 0000 0000 0000 0001
反码:0,000 0000 0000 0000 0000 0000 0000 0001
原码:0,000 0000 0000 0000 0000 0000 0000 0001
真值:+1
» 无符号
真值:+1
> 内存值二
内存二进制:1111 1111 1111 1111 1111 1111 1111 1111
» 有符号
补码:1,111 1111 1111 1111 1111 1111 1111 1111
反码:1,000 0000 0000 0000 0000 0000 0000 0000
原码:1,000 0000 0000 0000 0000 0000 0000 0001
真值:-1
» 无符号
真值:4294967295,即 $2^{32}-1$。