c/c++ 关于数的基础知识

来源:互联网 发布:win7网络连接感叹号 编辑:程序博客网 时间:2024/05/21 10:37

为什么计算机采用补码存储数据

http://www.360doc.com/content/12/1009/21/10086564_240513741.shtml

字符常量

  • 一种是普通字符,即用单撇号括起来的一个字符,如’b’ ,’y’,‘?’。字符常量在储存在计算机的储存单元中时,是以其代码(一般采用ASCII代码)储存的。

  • 另一种是转义字符,即特殊字符常量。转移字符是C语言中表示字符的一种特殊形式,其含义是将反斜杠后面的字符转换成另外的意义。

一种是用字符的八进制ASCII码,表示为:\0dd.这里,0dd是八进制值(0可以省略)。
另一种使用字符的十六进制ASCII码值,表示为 \xhh或Xhh 这里hh是两位十六进制值

如:’A’ ,’\101’ 和 ‘\x41’都表示同一个字符常量。

在C语言中,一个字符常量代表ASCII字符集中的一个字符,在程序中用单引号把一个ASCII字符集中的字符括起来作为字符常量。

字符常量在内存中占4个字节,存放的是字符的ASCII码(整型数据)。C语言规定所有字符常量都作为整型量来处理。

在C语言中,字符型数据与整型数据可通用:10+’R’

实型常量

又称实数或浮点数。在C语言中可以用两种形式表示一个实型常量。

  • 小数形式

小数形式是由数字和小数点组成的一种实数表示形式,例如0.123、.123、123.、0.0等都是合法的实型常量。
注意:小数形式表示的实型常量必须要有小数点。

*指数形式

这种形式类似数学中的指数形式。在数学中,一个可以用幂的形式来表示,如2.3026可以表示为0.23026×10^1 2.3026×10^0 23.026×10^-1等形式。在C语言中,则以“e”或“E”后跟一个整数来表示以“10”为底数的幂数。2.3026可以表示为0.23026E1、2.3026e0、23.026e-1。C语言语法规定,字母e或E之前必须要有数字,且e或E后面的指数必须为整数。如e3、5e3.6、.e、e等都是非法的指数形式。注意:在字母e或E的前后以及数字之间不得插入空格。

程序运行的过程中,其值不能被改变的量称为常量。常量有不同类型,其中12、0、-5为整型常量。’a”b’为字符常量。而4.6、-8.7则为实型常量。

一个实型常量可以赋给一个 float 型、double 型或 long double 变量。根据变量的类型截取实型常量中相应的有效位数字。

float double

C语言float double数据的验证,参考如下文档
http://download.csdn.net/download/qq_26437925/8781517

浮点数 IEEE 采用符号位指数位尾数位来表示

float 32bit: 符号位1 指数位8 尾数23
这里写图片描述

  • 指数部分 

占用8-bit的二进制数,可表示数值范围为0-255。但是指数应可正可负,所以IEEE规定,此处算出的次方(即是来自内存存储的内容,存储指数)须减去127才是真正的指数(实际的指数,如12.5转换为二进制为:1100.100=1.100100*2^3, 3即为实际指数)。除去全0,全1的情况(用全0表示0,全1表示无穷大),所以最后实际的指数大小是 -126 - 127

  • 最大float
(1.11111.....1)<sub>2</sub>×2<sup>127</sup> =(1+1-2<sup>-23</sup>) ×2<sup>127</sup> =(2-2<sup>-23</sup>) ×<sup>127</sup>= 2<sup>128</sup>-2<sub>104</sup>

double 64bit: 符号位1 指数位11 尾数52
这里写图片描述

浮点数的有效位数

单精度浮点数的有效位数是7位。
双精度浮点数的有效位数是16位
一个浮点数由三部分组成:符号位S、指数部分E(阶码)以及尾数部分M。

单精度浮点数(float)总共用32位来表示浮点数,其中尾数用23位存储,加上小数点前有一位隐藏的1(IEEE754规约数表示法),`2^(23+1) = 16777216。因为 10^7 < 16777216 < 10^8,`所以说单精度浮点数的有效位数是7位。考虑到第7位可能的四舍五入问题,所以单精度最少有6位有效数字(最小尺寸)。 同样地:双精度浮点数(double)总共用64位来表示浮点数,其中尾数用52位存储,`2^(52+1) = 9007199254740992,10^16 < 9007199254740992 < 10^17,`所以双精度的有效位数是16位。同样四舍五入,最少15位。

原码,补码,烦码,移码

  • 原码:

如果机器字长为n,那么一个数的原码就是用一个n位的二进制数,其中最高位为符号位:正数为0,负数为1。剩下的n-1位表示概数的绝对值。

例如: X=+101011 , [X]原= 00101011 X=-101011 , [X]原= 10101011
位数不够的用0补全。

PS:正数的原、反、补码都一样:0的原码跟反码都有两个,因为这里0被分为+0和-0

  • 反码:

知道了什么是原码,那反码就更是张飞吃豆芽——小菜一碟了。知道了原码,那么你只需要具备区分0跟1的能力就可以轻松求出反码,为什么呢?因为反码就是在原码的基础上,符号位不变其他位按位取反(就是0变1,1变0)就可以了。

例如:X=-101011 , [X]原= 10101011 ,[X]反=11010100

  • 补码:

补码也非常的简单就是在反码的基础上按照正常的加法运算加1。

例如:X=-101011 , [X]原= 10101011 ,[X]反=11010100,[X]补=11010101

PS:0的补码是唯一的,如果机器字长为8那么[0]补=00000000。

  • 移码:

移码最简单了,不管正负数,只要将其补码的符号位取反即可。

例如:X=-101011 , [X]原= 10101011 ,[X]反=11010100,[X]补=11010101,[X]移=01010101

#

0 0
原创粉丝点击