Operation System Notes: 数制基础

本文详细介绍了整型数和浮点数的基本概念及表示方法。包括32位和64位整型数的有符号与无符号表示范围、补码规则、以及C语言中的类型转换惯例。同时,还深入探讨了IEEE浮点数标准,解释了如何用(-1)^s*1.(frac)*2^E的形式来近似表示浮点数,并讨论了浮点数的取整规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Integer: 整型数


一般的整型数是32位(4Bytes),长整型则是64位(8Bytes)。另外还有两个8Bytes的类型是:存储地址的指针和double。(双精度浮点)


对于32位的整型而言,有符号和没符号的范围分别如下。


1)无符号


0 - 2^32 - 1


2)有符号


正:0 - 2^31 - 1(因为0占了一个数的表示)。

负:- 2^31 - -1


需要注意的是,整型数的有符号数表示负数是通过补码的规则:实际表示的值是8000 0000(负数) + 剩下的31位的表示的值(正数)。


-1的表示是FFFF FFFF,也就是32位全是1.

而最小的负数则是8000 0000,也就是只有最左边1位是1.


在这里介绍一个C语言的convention: 


如果一个表达式既包含有符号数也包含无符号数,那么会被隐式转换成无符号数进行比较。


同样的问题在Java中就不存在这个问题,因为Java当中不存在无符号数一说。如果想要获取无符号值可以转化为long。手动转化。


Float: 浮点数


浮点数需要理解IEEE的浮点数标准。需要知道浮点数并不能准确得表示每个准确的值,所以,在任何的语言当中凡是出现以浮点数的==作为判断条件都需要注意,许多时候,浮点数的等值判断就是坑。


下面来简单介绍下浮点数的格式(图片来源:http://wdxtub.com/2016/04/16/thin-csapp-1/):




一般而言,M的值都是在1-2之间的。其中整数位的1是附赠的,不占frac中的任何一位。但是,除了非正常的浮点数。如果一个浮点数的exp是0的话,那么就是非正常的浮点数。非正常浮点数的M值则是0到1之间。同样,0是附赠的。


另外,还有一点比较绕的是:


exp并不是直接赋给上面的E的。E = exp - bias. Bias = 2 ^ (k - 1)  - 1. k是exp的编码位数,所以单精度的Bias = 127. 


所以,计算机实际上做的是把任何一个小数近似地用:(-1)^s * 1.(frac) * 2^E来表示。或者中间变为0.(frac). 


所以,未必是每一个数都能用这样的approximation来表示。


需要再提一提的是浮点数的向偶取整:




简而言之,是在取舍的保留位数之后,如果有数值(只有后一位是1,其它是0,这种才是可近可不近的时候),看看如果进位后,整个数会不会是偶数,是的话就进位,否则就直接舍掉。其余都是四舍五入。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值