2018-2019-1 《信息安全系统设计基础》第二周学习总结
教材学习内容总结
- 排列表示一个对象的字节有两个通用的规则:小端法(最低有效字节在最前面)和大端法(最高有效字节在前面)。
- 表达式x>>k会将x算术右移k(左端补k个有效位)个位置,而x>>>k会对k做逻辑(左端补k个0)右移。
- 要将一个补码数字转换为一个更大的数据类型,可执行一个符号扩展。
- long:32位机器:4字节;64位机器:8字节
- 负数的范围比整数的范围大1
- 无符号数的编码:B2U(x->)=x*(2^x)之和
- 补码编码(计算机中最常见的有符号数表示方式):B2T=最高位x最高位权重+其他位权重之和
- 要将一个补码数字转换为一个更大的数据类型,可执行一个符号扩展。
- 在相同长度的无符号和有符号整数之间进行强制类型转换时,大多数C语言实现遵循的原则是底层的位模式不变。
-
在相同长度的无符号和有符号整数之间进行强制类型转换时,大多数C语言实现遵循的原则是底层的位模式不变。
-
最常见的浮点表示方式是由IEEE标准754定义的。它提供了几种不同的精度,最常见的是单精度(32位)和双精度(64位)。
-
由于表示的精度有限,浮点运算是不可结合的(书中举例P20)。
-
C语言允许在各种不同数据类型之间做强制类型转换。但要注意,将负数转换为无符号数可能会得到0,且强制类型转换的结果保持位值不变,只是改变了解释这些位的方式。
-
C语言支持所有整数数据类型的有符号和无符号运算,大多数数字都默认为是有符号的,所以要创建一个无符号常量,必须要就爱上后缀字符“U”或者‘u’,如123U。
-
零扩展和符号扩展:零扩展应用于无符号整数,符号扩展应用于有符号整数。
-
截断无符号数:x'=xmod(2^k) 截断k位
-
截断补码数值:x'=U2(T_k)(xmod2^k)
-
有符号数和无符号数的转换经常会导致程序出错而又不容易被发现,因此编程时一定要注意。
-
无符号数和补码的乘法一样,除法都是进行移位。无符号数的除法移位后补0,补码的除法移位后补1。
-
区分位运算和逻辑运算的区别与运算方法。
教材学习中的问题和解决过程
- 问题1:在看有符号数和无符号数之间的转换时,对转换规则中“位模式不变”产生了疑惑。
- 问题1解决方案:强制类型转换的结果保持位值不变,转换前的负数补码表示与转换后的16位无符号数表示是完全一样的。
代码调试中的问题和解决过程
- 问题1:gcc编译出错
- 问题1解决:通过错误提示“unrecognized command line option ‘-O’”发现是将小写的o写成了大写,导致出错
- 问题2:git出错
- 问题1解决:通过查看博客找到了解决方法:
git remote add origin https://github.com/用户名/xxx.git
$git fetch origin //获取远程更新 $git merge origin/master //把更新的内容合并到本地分支