目录
教材学习内容总结
- 第一周要点:
- 要点1:TCP/IP协议族简介;
- 要点2:正则表达式基础;
- 要点4:教材第二章。
- 教材第二章 “信息的表示和处理” 要点:
- 要点1:信息存储:
- 大端法与小端法;
- 整形与浮点型对同一数值的格式;
- 布尔代数:
&
,|
,|
,^
;
- 要点2:C语言中的运算:
- 位级运算:布尔运算、掩码运算;
- 逻辑运算:
&&
,||
,!
; - 移位运算:逻辑左移、逻辑右移(无符号数)、算数右移(有符号数);
- 要点3:整数表示:
- 无、有符号数编码;
- 有符号数原码、反码表示;
- 有、无符号数之间的转换
- 扩展、截断数字;
- 整数运算:
- 浮点数:
- 二进制小数;
- 舍入;
- 舍入;
- 浮点运算;
- C语言中的浮点数。
- 要点1:信息存储:
教材学习中的问题和解决过程
1. 什么是位模式?
- 问题回答:
计算机中所有二进制的0、1代码所组成的数字串。在位模式中,从右向左每位有一个固定的权值,相邻位之间权是一个固定的比例关系。
2. 对于 有符号数和无符号数之间的转换 的理解
在转换时, 位模式中每一位的数值是一样的、不改变的;改变的是最高位(有符号数符号位、无符号数最高有效位)的权值。
3. 数值绝对值相同,正数与负数之间的转换(练习题 2.21)
表达式 | 类型 | 求值 |
---|---|---|
-2147483647-1 == 2147483648U | ( _____________________ ) | ( _____________________ ) |
-2147483647-1 < 2147483647 | ( _____________________ ) | ( _____________________ ) |
-2147483647-1U < 2147483647 | ( _____________________ ) | ( _____________________ ) |
-2147483647-1 < -2147483647 | ( _____________________ ) | ( _____________________ ) |
-2147483647-1U < -2147483647 | ( _____________________ ) | ( _____________________ ) |
-
问题原因分析:
-2147483647-1
值得是C语言中 TMin 的写法,不可简单写成0x80000000
。
还是没有搞懂:数值绝对值相同的情况下,正数与负数之间的转换。
除0以外,符号位取反,数值位按位取反,再+1;即可将正数(或负数)转换为负数(或正数)。
例如:
第5个小题:-2147483647-1U
为0x80000000
(2^31),+2147483647
为0x7FFFFFFF
((2^31)-1) ,-2147483647
为0x7FFFFFFF
符号位取反(0xFFFFFFFF
),数值位按位取反(0x80000000
),再+1(==0x80000001
)。由于是无符号数与有符号数之间的比较,有符号数按无符号数看,所以-2147483647-1U < -2147483647
为0x01
。 -
问题解决方案:
表达式 | 类型 | 求值 |
---|---|---|
-2147483647-1 == 2147483648U | 无符号数 | 0x01 |
-2147483647-1 < 2147483647 | 有符号数 | 0x01 |
-2147483647-1U < 2147483647 | 无符号数 | 0x00 |
-2147483647-1 < -2147483647 | 有符号数 | 0x01 |
-2147483647-1U < -2147483647 | 无符号数 | 0x01 |
4. 对于 有符号数的加法溢出 的疑惑
-
疑惑:
1 - 1
的存在溢出么?
[0001] - [0001] = [0000]
对么? -
疑惑解答:
1 - 1
的存在溢出。
[0001] - [0001] = [0000]
错误。
对于无符号数而言,减法直接借位减。但对于有符号数来说,被减数为负数时,是加上该负数的补码。
这么来说的话,1 - 1
的二进制过程为:
[0001] + [1111] = [10000]
截断4位之后为[0000]
,此时是溢出。
运行如下实例:
# include <stdio.h>
int tadd_ok(int x, int y);
int main() {
printf("%d
",tadd_ok(0X00000001, 0x8FFFFFFF));
printf("%d
",tadd_ok(1, -1));
}
int tadd_ok(int x, int y) {
int sum = x+y;
int neg_over = x < 0 && y < 0 && sum >= 0;
int pos_over = x >= 0 && y >= 0 && sum < 0;
return !neg_over && !pos_over;
}
结果:
Linux> ./a.out
1
1
5. 用 myod XXX 实现 Linux 下 od -tx -tc XXX 的功能
[代码托管]
对应仓库网页链接:https://gitee.com/Yogile/YogileOne
2019-2020-第1学期subject_5_Cpt_System
- 代码提交过程截图:
- 代码量截图:
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 4000行 | 20篇 | 280小时 | |
第一周 | 66/66 | 1/1 | 24/24 | |
第二周 | 427/493 | 2/3 | 25/49 |
-
计划学习时间:16小时
-
实际学习时间:25小时