1.每台机器都有一个字长,指明了整数和指针的标称大小(normal size),长整数(long int)和指针的大小都是字长(32位机器是32位,64位机器是64位),字长代表了机器的寻址时地址大小,进而限定了寻址空间的大小,字长w的寻址范围是0-2的(w-1)次方,32位机上线是4G。除了和字长同步的类型(long int和指针)其他类型大小和机器无关,比如char,short,int4,long long int8, float4, double8在32位机器上对8字节的类型数据操作时,先编译成一系列4字节的操作代码。

2.大小端:对一个2字节的short:0x1234
地址:0x01 0x02
大端:12 34 (先存高有效位,再存低有效位)
小端:34 12
(PS:十进制转十六进制可以用除法,不断除,但显然的,我们可以通过先把一个十进制数字存到内存,计算机会存为一个一个字节,这个时候我们只需按字节取出,
每个字节再细分为2个4位,通过移位得到每半个字节上的数字,然后把每个数字转为对应的十六进制字符(0-f),连起来就ok了,最后注意一下大小端就好了。
其实可以直接用%x输出十六进制结果的 =。=)
网络上字节流中的字节顺序是大端模式。
对多个字节存一个数据的整数,浮点数等,是受大小端影响的,但对字符串,则没有,它就是一个字节存一个字符。
PS:像utf-8这种使用字节序列表示一个字符的,受大小端影响吗?网上资料:字符串倒是没有大端小端的问题,但是字符可能会有大端小端的问题,
因为字符有可能不是一个字节,可能是2个(比如在Java里)或者4个字节(Python里有选项可以使用UTF16或者UTF32),C里也有wchar_t,可能是2个或者4个字节。

3.位向量表示有限集合:
如题,书上给出的例子是这样的:
a=[01101001]表示{0,3,5,6}
b=[01010101]表示{0,2,4,6}
最终a&b={01000001}={0,6}

谁能解释一下这8位二进制是如何表示集合的呢?
答案:第 i 位 为 1 表示 i 在 集合里。从右边数起,第一个是0位,对于a:第0位是1所以集合有0,第3位是1所以集合里有3...

4.布尔类型:
a^0 = a, a^1 = ~a

5.逻辑右移:左边补0,算术右移:左边补最高位。默认地,对无符号数,>>means逻辑右移,对有符号数,>>means算术右移,整数x>>1代表(x-1)/2

6.补码:在无符号数编码的基础上,最高位对应的数值加符号。计算机对有符号数一般使用补码编码
(注意,所谓无符号数编码,补码,反码,原码只是对一系列位的解释,对一个8位数,他们解释成不同的数值,这个解释的逆过程则是他们编码的过程)

7.有符号数和无符号数之间的转换,所谓转换,只是针对某个n位的数,换一种解释的方式,并不改变位值。
C语言在对同时包含有符号数和无符号数的表达式时,隐性把有符号数转成无符号数,再进行计算。
书中说:这个对标准的算术运算,结果和直观无多大差异,只对<和>有差异,但我的测试结果明显不对:

1    if (-1 < 0u)
2    {
3    int i = 0;
4    }
5    else
6    {
7    unsigned int a = 2147483648;// 0x80000000;
8    int c = -2147483647;//0x80000001
9    int j = c - a;//j结果是1
10    int k = 0;
11    }

第1行:-1转成无符号后变得很大,所以执行else,和直观不同
第7-9行:直观上j应该是一个很小的负数,担结果却是1
总结:尽量不要互转,除非你确定任何数值都没有问题。具体分析就是一步一步来,反正规则就是转换只改变解释方式,不改变位值,并且默认有符号转无符号。
在书中还举了个很容易犯的错误:

int sumElement(int a[], unsigned len)
{
int i = 0;
int ret = 0;
for (i = 0; i <= len - 1; ++i)//当len=0时,0u-1得到的无符号数很大,其实本质上是一个负的有符号数转为一个无符号数本身是有问题的!
{    //我想应该没有通用的解决方法,书中说的len改成int是一种解决方法显然不完全对:len很大至变成int是负数呢。
//第二种方法是i < len,这个是因为这个应用中i一定不是负数,
//我觉得应该谨记:避免负的有符号数转无符号数,或者它的逆过程。
ret += a[i];
}
return ret;
}

8.从小数据类型变成大数据类型,如short to int
无符号数左边补0,有符号数左边补最高位

9.同时改变大小和符号情况下,大小优先级高:
short x = -12345;
unsigned int y = x;//y = ff ff cf c7,等于y = (unsigned)((int)x);

10.两个无符号数相加是否溢出:s = x + y; 如果s < x则溢出,因为y < 2的w次方,(s < y也可以)
我突然想起以前做校招笔试题时,就有求2个整数的平均值的问题,(x+y)/2可能溢出,x/2+y/2是错的,正确方式:(x & y) + ((x ^ y) >> 1),因为:

  每个整数都可以分解成对应的二进制,然后2个二进制相加,如果某位相同,则相加后该位应该变为0或2,即位的值*2,如果不同,则保留为1,所以其平均数为:x&y + (x^y)>>1,前者是位值相同部分相加的平均数,后者是位值不同部分相加的平均数

11.两个补码相加:
x+y>=2的(w-1)次方:正溢出
x+y<-2的(w-1)次方:负溢出
在中间则正常
x和y都是负数,x+y>=0则会发生负溢出;当x和y都是正数,但x+y<0则发生正溢出
书中特别提到Tmin(比如4位则Tmin=-8),-8的负还是-8!所以对tmin要保持警惕,看下一条:

12.补码的非:x=Tmin则x的非是Tmin,因为Tmin+Tmin=0(这个是对计算机而言哈,不是直观的)
x>Tmin则x的非是-x.
在位级表示上,求x的非的方法:书中提了2种方法,其实原理是一样的,反正x的非就是0-x,想象一下位级的减法:
00000000   :向最高位借1 => 11111112
xxxxxxxx            xxxxxxxx
所以非最低位就是1-原值(0则是1,1则是0,即原值的非),而最低位则是2-原值,即1-原值后+1,这就是书中的方法一了。
书中的方法二也可以推出:找到xxxxxxxx最右边的那个1,左边是原值的非,右边不用借位都保持0,自己的位借了2所以为1.

13.无符号数的乘法和补码的乘法 都使用位数截断。
判断乘法是否溢出可以用下面代码判断:
int mul_ok(int x, int y)
{
int p = x*y;
return !x || p/x == y;
}
x!=0情况的数学证明方法思路是x*y= a + t*2的w次方, b = a/x=>b*x + r = a,当b=y时,t=r=0:不溢出;b!=y时,t!=0溢出
上面是补码乘法溢出判定,无符号数乘法溢出也类似

也可以用先用更大的数据类型存结果,然后转为小数据类型,看相不相等:int x,y; long long int p = x*y; int q = (int)p;if (p!=q)溢出。

14.乘以一个常数可以把常数换成2的幂的和,即把乘法换成移位和加法(减法)

15.先不看浮点数相关,先看第3章:程序的机器级表示,第3章主要讲程序的汇编级别代码

转载于:https://www.cnblogs.com/Tearix/p/6917597.html

深入理解计算机系统 第二章要点相关推荐

  1. 电力电子技术第二章要点

    电力电子技术第二章要点 1.结合仿真理解电力二极管的开通.关断过程:  静态特性: 图1 电力二极管的伏安特性 (1)当电力二极管承受的正向电压大到一定值(门槛电压),正向电流开始增加,处于稳定导通状 ...

  2. 深入理解计算机系统——第九章 Virtual Memory

    深入理解计算机系统--第九章 Virtual Memory 9.1 Physical and Virtual Addressing 9.2 Address Spaces 9.3 VM as a Too ...

  3. 深入理解Magento – 第二章 – Magento请求分发与控制器

    深入理解Magento 作者:Alan Storm 翻译:Hailong Zhang 第二章 – Magento请求分发与控制器 Model-View-Controller (MVC) ,模型-视图- ...

  4. 信号与系统——初识到理解(第二章——信号与系统)

    目录 第二章 信号与系统 2.1 什么是信号及信号如何表征 2.1.1信号的概念 2.1.1信号的表征方法 2.2 信号如何分类 2.2.1 信号类别及基本概念 2.2.2 确定信号与随机信号 2.2 ...

  5. 深入理解计算机系统--第九章虚拟存储器

    9.虚拟存储器 为了更加有效地管理存储器且少出错,现代系统提供了对主存的抽象概念,叫做虚拟存储器(VM). 虚拟存储器是硬件异常,硬件地址翻译,主存,磁盘文件和内核软件的完美交互. 为每个进程提供一个 ...

  6. 深入理解JVM—第二章:Java内存区域与内存溢出异常

    1,概述 Java较C.C++,Java可以利用虚拟机的自动内存管理机制,避免繁琐的内存分配与回收.不容易出现内存泄漏和内存溢出问题. 内存泄漏:指程序申请到的内存空间不再归还(无法归还),可使用完该 ...

  7. 读深入理解计算机系统 - 第一章 计算机系统漫游 - 1.1 信息 = 位 + 上下文

    1.1 信息 = 位 + 上下文 先说一下位,计算机的最小单位,一个位可以取两个值1/0(高电平/低电平)代表两种状态(1个位=1bit). 但是世界事物千千万,无法用一个位来表示,怎么办呢? 某不知 ...

  8. linux动态分配全局置换,深入理解计算机系统 第九章 虚拟存储器

    虚拟存储器 定义: 对主存的抽象机制,是硬件异常.硬件地址翻译.主存.磁盘文件和内核软件的完美交互. 功能: 1. 将主存看成是一个存储在磁盘上的地址空间的高速缓存,在内存中只保存活动区域,并根据需要 ...

  9. 计算机网络基础知识第二章要点

    OSI第一层------物理网络 一.标准的拓扑结构 总线型拓扑结构.星型拓扑结构.环形拓扑结构 二.最新的网络拓扑结构 1.混合型(星型总线型拓扑结构.星型环形拓扑结构) 2.网状结构(完全网状拓扑 ...

  10. 深入理解计算机系统(CSAPP)含lab详解 完结

    文章目录 深入理解计算机操作系统-第一章 1.1 信息就是位 + 上下文 1.2 程序被其他程序翻译成不同的格式 1.3 了解编译系统如何工作是大有益处的 1.4 处理器读并解释储存在内存中的指令 1 ...

最新文章

  1. 【linux】在CentOS7上更改端口号时报错:Job for sshd.service failed because the control process exited with error
  2. 小鱼易连获腾讯数亿C轮投资,云视频布局产业互联网
  3. 关于json的操作 jsonArray---jsonObject
  4. python编程分析了一下高考那些事,发现了两个之最,原来是这样
  5. 严苛模式(StrictMode)
  6. 数据结构的简单理解(2)
  7. program collections
  8. jzoj1758-过河【dp】
  9. 5分钟搞定jQuery zepto.js 面向对象插件
  10. eclipse在ubuntu13.04下崩溃crash
  11. 回复《论WEB标准专家》。
  12. 使用 matlab 数字图像处理(二)—— 直方图均衡化(极简实现)
  13. redis常用命令getex_Redis 常用命令篇(末尾含不常用)
  14. android字体颜色渐变色,android背景颜色渐变
  15. c语言存储转置矩阵,C语言实现矩阵转置(附带源码)
  16. Verilog语言- 和c语言的区别
  17. 计算机在军事方面的应用
  18. wifi 小程序 透传_微信小程序一键连wifi
  19. uniapp开发:uniapp之切换vue3,一直使用一直爽
  20. Java while循环与dowhile循环

热门文章

  1. SimpleDateFormat-多线程问题
  2. 1.Java集合-HashMap实现原理及源码分析
  3. Boost.log链接问题
  4. 如何用PHP和JavaScript比较时期(包括时间)
  5. multiple多图选择,借助FormData通过ajax实现上传
  6. ScrollView中布局不能充满ScrollView的问题
  7. 人生每一件事都是为自己而做
  8. 吴彦祖计算机系统班 百度网盘,哪位吴彦祖(来自伸手党的夸赞) 有老詹的那场g6的百度云盘录像啊?我很需要...
  9. mysql left join右边有多条_left join 右表多条数据重复
  10. BZOJ4072[Wf2014] baggage