计算机系统导论——读书笔记——第二章 信息的表示和处理(持续更新)
第二章 信息的表示和处理
2.1 信息存储
2.1.1 十六进制
2.1.2 字数据大小
2.1.3 寻址和字节顺序
1.地址:对象所使用的字节中最小的地址
2.大端法:最高有效字节在前
小端法:最低有效字节在前(大多Intel兼容机使用)
3.发送方机器(内部代码)——>网络应用程序(网络标准)——>接收方机器(内部代码)
4.小程序——打印程序对象的字节表示
1 #include <stdio.h> 2 using namespace std; 3 4 typedef unsigned char * byte_pointer;//定义类型:指向unsigned char的指针 5 6 void show_byte(byte_pointer start, size_t len){ 7 size_t i; 8 for(i = 0; i < len; ++i) 9 printf(" %.2x", start[i]);//%.2x表示整数必须用至少两个数字的十六进制格式输出 10 printf("\n"); 11 } 12 13 void show_int(int x){ 14 show_byte((byte_pointer) &x, sizeof(int)); 15 } 16 17 void show_float(float x){ 18 show_byte((byte_pointer) &x, sizeof(float)); 19 } 20 21 void show_double(double x){ 22 show_byte((byte_pointer) &x, sizeof(double)); 23 } 24 25 void show_pointer(void * x){//void*是特殊类型的指针,没有相关联的类型信息 26 show_byte((byte_pointer) &x, sizeof(void *)); 27 } 28 29 int main(){ 30 int x; 31 float y; 32 double z; 33 while(scanf("%d %f %lf", &x, &y, &z)){ 34 show_int(x); 35 show_float(y); 36 show_double(z); 37 show_pointer(&x); 38 show_pointer(&y); 39 show_pointer(&z); 40 } 41 return 0; 42 }
输入
1
1
1-1
-1.0
-1.012345
1.001
1.001
输出
01 00 00 0000 00 80 3f00 00 00 00 00 00 f0 3f98 f5 bf ef fe 7f 00 0094 f5 bf ef fe 7f 00 0088 f5 bf ef fe 7f 00 00ff ff ff ff00 00 80 bf00 00 00 00 00 00 f0 bf98 f5 bf ef fe 7f 00 0094 f5 bf ef fe 7f 00 0088 f5 bf ef fe 7f 00 0039 30 00 00c5 20 80 3f6a bc 74 93 18 04 f0 3f98 f5 bf ef fe 7f 00 0094 f5 bf ef fe 7f 00 0088 f5 bf ef fe 7f 00 00
我的电脑是MaxOS,可以看出它是64位系统,采用小端法表示
5.可以通过在终端(mac是terminal,windows是命令行工具)执行命令man ascii得到一张ASCII字符码表,回车后运行结果如下
ASCII(7) BSD Miscellaneous Information Manual ASCII(7)NAMEascii -- octal, hexadecimal and decimal ASCII character setsDESCRIPTIONThe octal set:000 nul 001 soh 002 stx 003 etx 004 eot 005 enq 006 ack 007 bel010 bs 011 ht 012 nl 013 vt 014 np 015 cr 016 so 017 si020 dle 021 dc1 022 dc2 023 dc3 024 dc4 025 nak 026 syn 027 etb030 can 031 em 032 sub 033 esc 034 fs 035 gs 036 rs 037 us040 sp 041 ! 042 " 043 # 044 $ 045 % 046 & 047 '050 ( 051 ) 052 * 053 + 054 , 055 - 056 . 057 /060 0 061 1 062 2 063 3 064 4 065 5 066 6 067 7070 8 071 9 072 : 073 ; 074 < 075 = 076 > 077 ?100 @ 101 A 102 B 103 C 104 D 105 E 106 F 107 G110 H 111 I 112 J 113 K 114 L 115 M 116 N 117 O120 P 121 Q 122 R 123 S 124 T 125 U 126 V 127 W130 X 131 Y 132 Z 133 [ 134 \ 135 ] 136 ^ 137 _140 ` 141 a 142 b 143 c 144 d 145 e 146 f 147 g150 h 151 i 152 j 153 k 154 l 155 m 156 n 157 o160 p 161 q 162 r 163 s 164 t 165 u 166 v 167 w170 x 171 y 172 z 173 { 174 | 175 } 176 ~ 177 delThe hexadecimal set:00 nul 01 soh 02 stx 03 etx 04 eot 05 enq 06 ack 07 bel08 bs 09 ht 0a nl 0b vt 0c np 0d cr 0e so 0f si10 dle 11 dc1 12 dc2 13 dc3 14 dc4 15 nak 16 syn 17 etb18 can 19 em 1a sub 1b esc 1c fs 1d gs 1e rs 1f us20 sp 21 ! 22 " 23 # 24 $ 25 % 26 & 27 '28 ( 29 ) 2a * 2b + 2c , 2d - 2e . 2f /30 0 31 1 32 2 33 3 34 4 35 5 36 6 37 738 8 39 9 3a : 3b ; 3c < 3d = 3e > 3f ?40 @ 41 A 42 B 43 C 44 D 45 E 46 F 47 G48 H 49 I 4a J 4b K 4c L 4d M 4e N 4f O50 P 51 Q 52 R 53 S 54 T 55 U 56 V 57 W58 X 59 Y 5a Z 5b [ 5c \ 5d ] 5e ^ 5f _60 ` 61 a 62 b 63 c 64 d 65 e 66 f 67 g68 h 69 i 6a j 6b k 6c l 6d m 6e n 6f o70 p 71 q 72 r 73 s 74 t 75 u 76 v 77 w78 x 79 y 7a z 7b { 7c | 7d } 7e ~ 7f delThe decimal set:0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 '40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 /48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 756 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ?64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 delFILES/usr/share/misc/asciiHISTORYAn ascii manual page appeared in Version 7 AT&T UNIX.BSD June 5, 1993 BSD
(END)
2.1.4 表示字符串
1.十进制数字‘y’的ascii码正好是0x3y
2.strlen(str)函数不计算终止的空字符(ascii码为0x00)
3.字符编码方式:
(1)ASCII (American Standard Code for Information interchange)
(2)Unicode (Unique Code)
(3)UTF-8 / UTF-16 / UFT-32 (Unicode Transformation Format)
详见文章:https://knightyun.github.io/2019/01/27/ascii-unicode
2.1.5 表示代码
2.1.6 布尔代数(Boolean Algebra)简介
1.布尔运算&对|有分配律:a&(b|c) = (a&b)|(a&c)
布尔运算|对&有分配律:a|(b&c) = (a|b)&(a|c)
2.位向量:长度为w,由0和1组成的串
应用:表示有限集合/压位运算(例:[01101010]表示集合{1,3,5,6}),位向量掩码/屏蔽信号
3.布尔环(Boolean ring),类似于整环/整数环
“加法”逆元:^类似于+; 每个整数x有加法逆元-x使得x+(-x)=0,类似地,每个布尔元素a都有“加法逆元”a使得a^a=0; 有趣的性质:(a^b)^a=b
1 //这是一个不需要第三个量的交换函数,不过它并没有性能上的优势 2 void inplace_swap(int *x, int *y){//*x = a, *y = b 3 *x = *x ^ *y;//*x = a^b, *y = b 4 *y = *x ^ *y;//*x = a^b, *y = a 5 *x = *x ^ *y;//*x = b, *y = a 6 }
2.1.7 C语言中的位级运算:&, |, ^, ~
2.1.8 C语言中的逻辑运算: &&, ||, !
2.1.9 C语言中的移位运算:>>, <<
1.逻辑右移(高位补0,无符号数进行逻辑右移)
算数右移(高位补符号位,有符号数进行算数右移)
2.运算符优先级:见https://blog.csdn.net/changexhao/article/details/82556761
(1)初级运算符[]().->
(2)单目运算符
(3)算数运算符
(4)移位运算符
(5)关系运算符
(6)位级运算符
(7)逻辑运算符
(8)赋值运算符
2.2 整数表示
2.2.1 整形数据类型
2.2.2 无符号数的编码(unsigned)
2.2.3 补码编码(two's-complement)
1.<limits.h>库:INT_MIN, INT_MAX, UINT_MAX
<stdint.h>库:intN_t, UintN_t (t = 16,32,64等)
(我在xcode上没有include这两个库也能直接使用INT_MIN、int32_t等)
2.有符号数的表示方法
(1)补码(two's-complement):最高位权重为-2^(w-1)
(2)反码(ones' complement):最高位权重为-(2^(w-1)-1)
(3)原码(sign-magnitude):最高位为1表示所有其他位权重为负
注:(2)(3)中0的表示法不唯一,有+0和-0两种
2.2.4 有符号数和无符号数之间的转换
(可能)改变数值,但不改变位表示
1.补码转换为无符号数(w位):
TMin <= x < 0, T2U(x) = x + 2^w
0 <= x <= TMax, T2U(x) = x
2.无符号数转换为有符号数(w位):
0 <= x <= TMax, U2T(x) = x
TMax < x <= UMax, U2T(x) = x - 2^w
2.2.5 C语言中的有符号数和无符号数
1.数字常量默认为有符号数,加上后缀u或U可创建无符号数常量
2.类型转换的方式:
(1)显式:强制类型转换
(2)隐式:不同类型变量间赋值
3.%d有符号十进制,%u无符号十进制,%o八进制,%x十六进制
4.C语言对于同时包含有符号数和无符号数的表达式,会隐式地将有符号数转换为非负的无符号数
1 /* 2 这是一个测试函数 3 注:TMin写成-2147483647-1而非-2147483648 4 是因为limits.h中定义INT_MIN=-INT_MAX-1,以规避某些奇怪的现象 5 */ 6 #include <cstdio> 7 using namespace std; 8 9 int main(){ 10 printf("-1 < 0u = %d\n", -1 < 0u); 11 printf(" -1 = 0x%x \n", -1); 12 printf(" 0u = 0x%x\n\n", 0u); 13 14 printf("2147483547 > (int)2147483648u = %d\n", 2147483547 > (int)2147483648u); 15 printf(" 2147483547 = 0x%x \n", 2147483547); 16 printf(" (int)2147483648u = 0x%x\n\n", (int)2147483648u); 17 18 printf("-2147483647-1u < 2147483647 = %d\n", -2147483647-1u < 2147483647); 19 printf(" -2147483647-1u = 0x%x \n", -2147483647-1u); 20 printf(" 2147483647 = 0x%x\n\n", 2147483647); 21 22 printf("-2147483647-1u < -2147483647 = %d\n", -2147483647-1u < -2147483647); 23 printf(" -2147483647-1u = 0x%x \n", -2147483647-1u); 24 printf(" -2147483647 = 0x%x\n\n", -2147483647); 25 return 0; 26 }
运行结果如下
-1 < 0u = 0-1 = 0xffffffff 0u = 0x02147483547 > (int)2147483648u = 12147483547 = 0x7fffff9b (int)2147483648u = 0x80000000-2147483647-1u < 2147483647 = 0-2147483647-1u = 0x80000000 2147483647 = 0x7fffffff-2147483647-1u < -2147483647 = 1-2147483647-1u = 0x80000000 -2147483647 = 0x80000001
2.4 浮点数
2.4.1 二进制小数
2.4.2 IEEE浮点表示
1.表示形式:
(1)符号(sign)s: 表示+-
(2)尾数(significand)M:二进制小数,取值范围为[1,2)或[0,1)
(3)阶码(exponent)E:对浮点数加权,权重为2的E次幂
2.编码:
s编码符号sign s,exp编码阶码exponent E,frac编码尾数significand M
3.三种情况
(1)规格化的(noemalized): exp!=00...0 && exp!=11...1
i. 阶码 E = exp - bias, bias = 2^(k-1)-1, k=exp的位数
ii. 尾数 M = 1.xx...x = 1.frac的位(隐含的以1开头的表示)
(2)非规格化的(denormalized): exp == 00...0
i. 阶码 E = 1 - bias, bias = 2^(k-1)-1, k=exp的位数
ii. 尾数 M = 0.xx...x = 0.frac的位
iii.注意:0.0有两种表示方法+0.0和-0.0,符号位分别为0或1,其他位全部为0
(3)特殊值: exp == 11...1
i. 无穷:frac = 00...0, s=0或1表示+∞或-∞,能够表示溢出的运算结果,如x/0
ii. Nan(not a number): frac != 00...0, 表示非实数的运算结果,如根号-1,∞-∞
4.三种情况的数字分布
非规格化数字的阶码定义为E=1-bias可以补偿非规格化的尾数没有隐含的开头1,有助于数字表示的平滑转变;否则,在绝对值最大的非规格化数字(其二进制表示为0 00...0 11...1)和绝对值最小的规格化数字(其二进制表示为0 00...01 00...0)之间将存在跳跃
2.4.3 数字示例
1. 处理正浮点数时,若按照无符号整数解释他们的二进制表示,则可以发现它们的大小顺序不变;负浮点数只需要倒序
转载于:https://www.cnblogs.com/tanshiyin-20001111/p/11558871.html
计算机系统导论——读书笔记——第二章 信息的表示和处理(持续更新)相关推荐
- 《深入理解计算机系统》(CSAPP)读书笔记 —— 第二章 信息的表示和处理
本章主要研究了计算机中无符号数,补码,浮点数的编码方式,通过研究数字的实际编码方式,我们能够了解计算机中不同类型的数据可表示的值的范围,不同算术运算的属性,可以知道计算机是如何处理数据溢出的.了解计算 ...
- 计算机系统导论第九章,计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新)...
计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新) 第三章 程序的机器级表示 3.1 历史观点 3.2 程序编码 1. 命令行 (1)编译 Linux> gcc -Og ...
- 《计算传播学导论》读书笔记——第二章文本分析简介
<计算传播学导论>读书笔记--第二章文本分析简介 第一节 文本分析研究现状 常用文本挖掘技术 第二节 文本分析与传播学研究 (一)为什么文本挖掘技术逐渐受到传播学者的关注 (二)不同文本分 ...
- C++ Primer Plus读书笔记第二章
自学了一段时间的C++打算还是要系统的整理一下一些知识点,让学习思路更清晰,不然老是学一点忘一点,这个读书笔记用来记录这段时间对C++ Primer Plus一书中知识点的记录,尽量会写的详细一点.直 ...
- 《软件测试经验与教训》读书笔记---第二章
<软件测试经验与教训>读书笔记--目录 第一章 测试员的角色 第二章 按测试员的方式思考 第三章 测试手段 第四章 程序错误分析 第五章 测试自动化 第六章 测试文档 第七章 与程序员交互 ...
- 计算机网络(第五版 作者:AndrewS.Tanenbaum David J.Wetherall 清华大学出版社)读书笔记----第二章的学习
计算机网络第二章--物理层读书笔记 1.物理层是网络的技术设置,物理层的材质和带宽决定了最大的传输速率. 2.传输介质的分类:引导性(有线介质)和非引导性(无线介质). (1)有线介质:磁介质.双绞线 ...
- In-memory Computing with SAP HANA读书笔记 - 第二章:SAP HANA overview
本文为In-memory Computing with SAP HANA on Lenovo X6 Systems第二章SAP HANA overview的读书笔记. 本章最重要的部分是SAP HAN ...
- 【编程珠玑】读书笔记 第二章 算法
2013-07-11 22:00:28 第二章 算法 本章围绕三个问题进行算法讨论,包括元素的查找.字符串的旋转.以及变位词的查找. 下面给出了实现代码.以及测试结果. 问题一 查找不存在的元素 思路 ...
- 《辛雷学习方法》读书笔记——第二章 心态
第二章 心态 (1)保持良好心态:学习时保持良好心态,你才能比较容易入门.深入掌握知识.灵活运用知识.学习时始终保持着轻松愉悦振奋的心情,你就容易产生学习心得,更容易灵活运用. (2)爱情对心态影 ...
最新文章
- MicroPython实例之TPYBoardv102自动浇花系统
- win10网络邻居看到linux,在Deepin 20系统中网络共享Windows无法访问的另类解决方法...
- python程序如何封装成接口_python接口自动化如何封装获取常量的类
- 如何在读研读博的道路上迅速失败?
- 部分Dell 740 不支持 Xen Server?
- XSS,CSRF防范 也是慢慢更
- 【Elasticsearch】es keywods 类型数据 写入后查询不到
- ASP.NET Core 新建项目(Windows) - ASP.NET Core 基础教程 - 简单教程,简单编程
- 原生js 修改html,原生JS改变HTML内容
- nginx反向代理,调度器,优化
- LLDP协议、STP协议 笔记
- BatteryProperty上报流程
- 从.Net类库代码来看Asp.net运行时(转自酷网动力)
- HTML中引入CSS文件的几种方法
- android启动微信服务器,Android之高仿微信“启动画面”(一)
- 美国医院管理历程,学而时习之
- 联想拯救者R720如何组建双通道内存
- 深圳IT培训机构,曝光
- 汽车融资租赁,还看商业模式?控制汽车是关键!
- 关于编号/编码命名的问题
热门文章
- 人脑与计算机类比文献,公务员考试行测:言语理解与表达习题集(二)(2)
- 渗透测试技巧:SSH指纹与信息收集
- LOVIN' YOU 蜜妮莱普顿(Minnie Riperton)
- 【C/C++】C语言复制字符串及复制函数汇总(strcpy()/memcpy()/strncpy()/memmove())
- 读源码(七)—— ejs
- 中央处理器(CPU)的组成
- StrongSwan虚拟测试环境搭建
- ArcGISPro 批量插入层图并将图层符号设置为指定目标图层的样式
- HTML表单提交方式post和get的区别
- 浪漫纯白记录爱的轨迹 西部数据移动存储“七夕”献礼