首页 真值与内存的相互转换
文章
取消

真值与内存的相互转换

总览

一些自创的名词定义:

  1. 在内存中实际存储的值称为内存值

  2. 内存值经过字节序转换后,以无符号形式写成的数值,称为内存数值。内存数值用来直观纯粹地反映内存值的样貌。

    用二进制表示的内存数值称为内存二进制

    用十六进制表示的内存数值称为内存十六进制

    用八进制表示的内存数值称为内存八进制

    用无符号十进制表示的内存数值称为内存十进制

  3. 平时直接看到的数值,代码里直接书写的数值等,称为真值

转换过程一张图:

一些说明:

  1. 不妨认为真值这个概念还在数学范畴,有正、负、零的概念,还没有计算机科学范畴中有符号无符号的概念。接下来,进入计算机科学范畴,你可以视之为有符号数或者无符号数。

  2. 负真值只能视作有符号数;非负真值既可以视作有符号数,又可以视作无符号数。

  3. 内存数值用来直观纯粹地反映内存值的样貌,所以它本身是完全无视符号位的,即将它视作无符号数。当我们的目的不是想要反映内存值样貌的时候,可将内存数值视作有符号数或者无符号数,并进行相应的转换得到对应的真值。

  4. 用不同进制表示一个数时,十六进制、八进制、二进制形式都是将数视作无符号形式,将符号位视作一个普通的数值位包含在内进行转换的,故转换成的十六进制、八进制、二进制形式都是无符号形式且只有无符号形式。将一个数转换为十进制时则不同,我们既可以将数视作无符号形式进行转换,也可以将数视作有符号形式进行转换。若将数视作无符号形式,则将符号位视作一个普通的数值位包含在内进行转换,转换成的十进制形式是无符号形式;若将数视作有符号形式,则符号位会被真的视作符号位进行转换,转换成的十进制形式是有符号形式。

    即,只存在以下说法:

    以无符号十六进制形式打印内存数值。(打印内存十六进制)

    以无符号八进制形式打印内存数值。(打印内存八进制)

    以无符号二进制形式打印内存数值。(打印内存二进制)

    以无符号十进制形式打印内存数值。(打印内存十进制)

    以有符号十进制形式打印内存数值。

从真值到内存(写)

> 真值一

真值:+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$。

本文由作者按照 CC BY 4.0 进行授权
热门标签

C语言标准发展历史

简析HTTPS

热门标签