系列文章目录
信息的表示和处理 :
- Information Storage(信息存储)
- Integer Representation(整数表示)
- Integer Arithmetic(整数运算)
- Floating Point(浮点数)
文章目录
- 系列文章目录
- 前言
- 一、整数数据类型
- 二、无符号数的编码(Unsigned Encodings)
- 三、补码编码(Two's Complement Encodings)
- 四、有符号数和无符号数之间的转换(Conversions between Signed and Unsigned)
- 4.1有符号数 <-> 无符号数
- 五、扩展一个数字的位表示(Expanding the Bit Representation of a Number)
- 5.1 无符号数扩展
- 5.2 有符号数的扩展
- 六、截断数字(Truncating unsigned number)
- 6.1 截断无符号数
- 6.2 截断无符号数
- 总结
- 参考文献
前言
本文参考书籍是《深入理解计算机系统 3th 中文版》,本文的图片大多是参考和来自于b站up主九曲阑干。非常感谢大佬,侵权删。
下列图列出了引入的数学术语,用于精确定义和描述计算机如何编码和操作整数,这里列出作为参考
- 无符号表示与补码表示
- 有符号数到无符号数的转换会产生漏洞,避免错误的方法之一是绝不使用无符号数。
- 除了 C 以外很少有语言支持无符号整数,Java 就只支持有符号数
一、整数数据类型
可以看到上述表中只有long类型的取值范围和机器相关。
二、无符号数的编码(Unsigned Encodings)
**原理:**无符号数编码的定义:(Binary to Unsigned)
- 把数字看做向量,这个想法还挺好的。但是我认为它不符合向量的运算(如果要取进位的话),所以在不考虑进位的情况下,可以当作向量。
- 这里将每个位上的x看做一个权重,由于是2进制所以该权重是能取0或者1
三、补码编码(Two’s Complement Encodings)
用补码编码的形式来表示有符号数 8分42
- 最高位是一个负权重的概念 ,最高位是符号位这一概念不是定义,而是一个推论。 补码的定义实际就是将符号位解释为负权。
B 2 T 4 ( [ 0101 ] ) = − 0 ⋅ 2 3 + 1 ⋅ 2 3 + 0 ⋅ 2 1 + 1 ⋅ 2 0 = 5 B 2 T 4 ( [ 1011 ] ) = − 1 ⋅ 2 3 + 0 ⋅ 2 3 + 1 ⋅ 2 1 + 1 ⋅ 2 0 = − 5 B2T_4([0101]) = -0 \cdot 2^3 + 1 \cdot 2^3 + 0 \cdot 2^1 + 1 \cdot 2^0 = 5 \\ B2T_4([1011]) = -1 \cdot 2^3 + 0 \cdot 2^3 + 1 \cdot 2^1 + 1 \cdot 2^0 = -5 B2T4([0101])=−0⋅23+1⋅23+0⋅21+1⋅20=5B2T4([1011])=−1⋅23+0⋅23+1⋅21+1⋅20=−5
下面这幅图很好能表示权重这一概念在进制里面的应用:
special numerical:
有符号数的-1 和无符号数的最大值,它们俩的二进制编码是一样的!!!
有符号数和无符号数由于它们对最高位的解释不同,导致了二者结果不同。
四、有符号数和无符号数之间的转换(Conversions between Signed and Unsigned)
** 在有符号数与无符号数之间进行强制类型转换的结果是保持位值不变,只改变解释位的方式。 **
// conversion between signed and unsigned
short int a = -12345;
usigned short b = (unsigned short) a;
printf("a = %d, b = %u", a, b);
运行结果:
a = -12345, b = 53191
强制转换并没有改变其二进制位,变得是二进制解释的方式变化了
4.1有符号数 <-> 无符号数
为什么要去了解二者之间的转换,来看下面这个例子
int a = -1;
unsigned int b = 0;
if(a < b)
printf("-1 < 0");
else
printf("-1 > 0");
运行结果是
-1 > 0
这是因为C语言在比较两个不同类型的数据的时候,C语言隐式地将有符号数转成了无符号数。
五、扩展一个数字的位表示(Expanding the Bit Representation of a Number)
5.1 无符号数扩展
扩展无符号数使用零扩展,即在最高位前加 0
5.2 有符号数的扩展
扩展有符号数使用符号扩展,即在最高位前加最高有效位的值
为什么要这么做?接下来证明一下扩展前和扩展后是相等的(编译器解释,展示)。用一个不太严谨的数学归纳法:
简单证明一下扩展1位是相等的:
接下来就是以此类推下去,得证:符号扩展后二进制转化为有符号数,其数值不变
六、截断数字(Truncating unsigned number)
位数多转向位数少的转换,肯定涉及到要舍取位数多余的部分。计算机要采取这样的操作就是取模!
6.1 截断无符号数
如果看不懂,来看看10进制
6.2 截断无符号数
总结
第一节是简单介绍整型数据有哪些类型
第二节是无符号数的编码,主要是权重这样的一个概念
第三节是补码的最高位是负权重的概念
第四节是位数相同的一个转换
第五节是位数少向位数多扩展
第六节是位数多转向位数少的转换
参考文献
- 《深入理解计算机系统 3th 中文版》
- b站up主九曲阑干
- 《深入理解计算机系统(CSAPP)》全书学习笔记(详细) 这一章直接的链接是2 信号表示和处理