搜索到的答案都是表示方法,在百度会理解为对数,想问大佬们计算机对 数 的表示原理是什么呢,感谢感谢
分为 整数 和 浮点数
【定义】 正数 的 补码 就是它的 原码;负数 的 补码 为 它的反码加一;
真值:+ 00000000 00000000 00000000 00100101
补码: 00000000 00000000 00000000 00100101
真值:- 00000000 00000000 00000000 00100101
补码: 11111111 11111111 11111111 11011011
$$[x]_补 = \begin{cases} x & (0 \le x < 2^{n-1})\ 2^{n} + x & (-2^{n-1} \le x < 0) \end{cases}$$ 这里 $x$ 代表真值,而 $n$ 的取值是 $8、16、32、64$,我们通常说的整型
int
都是 32位 的,本文就以 $n = 32$ 的情况进行阐述;
对于三种编码方式,总结如下:
1)这三种机器数的最高位均为符号位;
2)当真值为正数时,原码、反码、补码的表示形式相同,符号位用 "0" 表示,数值部分真值相同;
3)当真值为负数时,原码、反码、补码的表示形式不同,但是符号位都用 "1" 表示,数值部分:反码是原码的 "按位取反",补码是反码加一;
正数
真值:+ 00000000 00000000 00000000 00100101
原码: 00000000 00000000 00000000 00100101
反码: 00000000 00000000 00000000 00100101
补码: 00000000 00000000 00000000 00100101
负数
真值:- 00000000 00000000 00000000 00100101
原码: 10000000 00000000 00000000 00100101
反码: 11111111 11111111 11111111 11011010
补码: 11111111 11111111 11111111 11011011
$value$:代表要表示的浮点数;
$sign$:代表 $value$ 的正负号,它的取值只能是 0 或 1:取值为 0 是正数,取值为 1 是负数;
$base$:代表基数,或者说进制,它的取值大于等于 2;
$fraction$:代表尾数,或者说精度,是 $base$ 进制的小数,并且 $1 \le fraction \lt base$,这意味着,小数点前面只能有一位数字;
$exponent$:代表指数,是一个整数,可正可负,并且为了直观一般采用 十进制 表示。
110011
放入内存。我们将内存中存储的尾数命名为 $f$,真正的尾数命名为 $fraction$,则么它们之间的关系为: $$fraction = 1.f$$float
和double
分配给指数位的比特位不同,所以需要分情况讨论;float
和double
的实际位数来举例说明实际内存中的存储方式。float
还是double
。float
类型,内存分布如下:double
类型,内存分布如下:浮点数类型 | 指数位数 | 指数范围 | 尾数位数 | 尾数范围 |
---|---|---|---|---|
float | $8$ | $[-2^7+1,2^7]$ | $23$ | $[(0)2, (\underbrace{1...1}{23})_2]$ |
double | $11$ | $[-2^{10}+1,2^{10}]$ | $52$ | $[(0)2, (\underbrace{1...1}{52})_2]$ |
☀️光天化日学C语言☀️(23)- 整数的存储 | 补码到底有什么用?_英雄哪里出来-CSDN博客 补码到底有什么用? https://blog.csdn.net/WhereIsHeroFrom/article/details/118666729
☀️光天化日学C语言☀️(24)- 浮点数的存储 | 天才般的设计,反正我这么认为_英雄哪里出来-CSDN博客 浮点数的存储,天才般的设计 https://blog.csdn.net/WhereIsHeroFrom/article/details/118690590