2019-2020-1 20175333曹雅坤 《信息安全系统设计基础》第三周学习总结
*补码表示
- 正数的原码、反码以及补码是其本身。
- 负数的原码是其本身,反码是对原码除符号位之外的各位取反,补码则是反码加1
- 补码的优点:
补码的范围比原码和反码的范围大出许多。
对于有符号整数的运算能够把符号位同数值位为一起处理
如果单独考虑符号位,CPU需要对最高位进行判断,计算机的最底层实现会变得非常复杂。 - 整数溢出
整数是一个定长,它有储存的最大值,当去存储一个大于这个值的最大值时,将会导致溢出。
溢出会导致不可知的问题。没有办法去用一个应用程序来判断先前计算的结果在实际上是否也是正确的,可导致某些类型的bug
- 信息储存
- 字
每个计算机都有一个字长,指明整数和指针数据的标称大小。因为虚拟地址是以这样的一个字来编码的,所以字长最重要的系统参数就是虚拟地址空间的最大大小。
- gcc -m32/64
当没有-m32或-m64参数时,一般情况下会生成跟操作系统位数一致的代码
gcc -m32 可以在64位机上(比如实验楼的环境)生成32位的代码
- 数值运算
- 无符号数
- 有符号数(补码)
- 信息的存储
- 大段与小端:不同数据类型对待同一数据有着不同的处理方法
- 网络字节序:网络上的数据流是字节流,第一个字节被视为高位,大端字节序。
在传输时可以不进行转换。
- 整数的表示
- char 字符型数据,占用一个字节
- unsigned char 无符号字符型数据,占用一个字节
- short 短整形数据,占用两个字节
- unsigned short 无符号短整型数据,占用两个字节
- int 整形数据,占用两个字节
- unsigned int 无符号整型数据,占用两个字节
- long 长整型数据,占用四个字节
- unsigned long 无符号长整型数据,占用四个字节
- 符号数与无符号数之间的转换
有符号数转换为无符号数时,负数转换为大的正数(可以理解为原值加上2的n次方),而正数保持不变。
x<0 T2Uw(x)=x+2^w
x>0 T2Uw(x)=x+2^w
(w表示数据类型的位数)
无符号数转换为有符号数时,对于小的数将保持原值,对于大的数则转换为负数(可以理解为原值减去2的n次方)
u<2^(w-1) U2Tw(u)=u
u>=2^(w-1) U2Tw(u)=u-2^w
(w表示数据类型的位数)
- 截断数字
截断一个数字可能会改变其值,这也是值溢出的一种形式。,
无符号数x,将其截断成k位,mod 2^k。
有符号数x,先将其看作无符号数截断,然后在转换成有符号数。
- 补码的非
补码非运算
对于范围在[-2(w-1),2(w-1))中的x,补码的非运算有如下两种情况:
x=-2(w-1)时,为-2(w-1)
x>-2^(w-1)时,为-x
位级补码非
对每一位求补,再对结果+1
设k为最右面的1的位置,将k左边的所有位取反。