计算机组成原理学习笔记(2):无符号数和有符号数

计算机组成原理学习笔记(2)

无符号数和有符号数

前言

第一篇学习了计算机组成原理的核心,冯诺依曼结构。由于确实没学好,就不从头开始学了。这一篇开始学习计算机的运算方法。首先来学习无符号数和有符号数。基本就是学习基本概念,然后提出问题,解决问题这样的学习节奏。

什么是无符号数?

就是没有符号位的数,机器字长为16位时,表示范围是0~65535

什么是有符号数?

就是把最高位当作符号位的数,机器字长为16位时,表示范围是==-32768~32767==。

为什么要发明有符号数?

这是为了在计算机中用统一的格式来表示数值和正负号,而不出现"+","-"这样的字符。

有符号数会导致什么问题?

由于有符号数是由符号位和数值位两部分组成,所以它的计算方法和正常的无符号数肯定是有区别的,马上要学习的源码,补码,反码,移码就是为了解决这个问题而被发明的。

为什么有符号数负数比正数多1?

机器字长为16位时,表示范围是 -32768~32767
负数部分比正数部分多了1,直觉上判断,除去符号位,后面的15位数值为可以表示的范围是0~32767。再加上符号位,那表示范围应该是 -32767~32767,这个-32768是哪里来的呢?

原因就在于1,000,0000,0000,0000和0,000,0000,0000,0000。一个表示+0,一个表示-0,有点重复了。另外,1,000,0000,0000,0000还有另一种理解,那就是1,111,1111,1111,1111数值位再加一,也就是-(32767 + 1),也就是-32768,所以其实-32768就是-0,这应该也算是一种约定俗成吧,毕竟逻辑上有一点牵强。

下面引用大师的话来解释这个问题:

深入理解计算机(第三版)p53:
不幸的是,补码表示的不对称性和C语言的转换规则之间奇怪的交互,迫使我们用这种不同寻常的方式表示0x80。及-127-1

后记

这就是我学习计算机运算方法的第一篇笔记。后面的问题都是这个符号位引起的,所以这个有符号数算是一个导火索吧,哈哈。这应该算是人类把负数这一人类花了几千年发明的数学概念努力解释给计算机听吧,计算机当然是不可能听懂的,不过能算出正确答案就够了,哈。

你可能感兴趣的:(计算机组成原理学习笔记)