Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1489049
  • 博文数量: 226
  • 博客积分: 3997
  • 博客等级: 少校
  • 技术积分: 2369
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-19 17:26
个人简介

Never save something for a special occasion. Every day in your life is a special occasion.

文章分类

全部博文(226)

文章存档

2018年(5)

2017年(11)

2016年(1)

2015年(17)

2014年(14)

2013年(30)

2012年(5)

2011年(52)

2010年(107)

分类: C/C++

2010-07-25 15:53:39

基本类型与转换
 
keyword:
基本类型
有符号数和无符号数
自动转换
强制转换
 
C的类型树
1、基本类型:字符(char)、整数(short/int/long)、浮点(float/double)。另外,字符和整数可与unsigned组合成无符号型。
2、复合类型:数组、结构、联合、枚举
3、VOID
4、*
 
字符
大小为1B,值为ASCII。取值范围一般是-128~127,也有机器把char当作unsighed char型对待,此时取值范围一般是0~255.
 
整数
[unsigned ] + short|int|long
整数的长度
2 ≤ sizeof(short) ≤ sizeof(int)
4 ≤ sizeof(long)
VC6.0,short、int、long的长度分别为 2、4、4
 
Signed/Unsigned
无符号数
有符号数
模 M
 
-1的补码为 全1, +(-1) 即 +(M-1),这就是 用加法器实现减法运算 的原理。
 
端模式
整数(short/int/long)各字节在内存中保存的顺序问题,称为Endian,又称 主机序(本地充).
Big-Endian(BE),就是高位字节(权值较大的字节)排放在内存的低地址端,低位字节排放在内存的高地址端。
Little-Endian(LE), 就是低位字节(权值较小的字节)排放在内存的低地址端,高位字节排放在内存的高地址端。
 
eg
双字 0x01020304(DWORD) 在内存中的分布
地址 4000 4001 4002 4003
LE 04 03 02 01
BE 01 02 03 04


浮点数
float类型变量是如何存放的呢?
目前大多数高级语言(包括C)都按照 IEEE-754标准来规定浮点数的存储格式。
IEEE-754规定,单精度浮点数用4字节存储,双精度浮点数用8字节存储.
IEEE-754标准
S+E+M
Sign 符号位,尾数的符号位;
Exponent 阶,即指数,用“+bias”表示;
Mantissa 尾数,即有效小数,用原码表示;
需要注意的是,非零的浮点数规格化以后小数点左边总是有且仅有一个1,所以没必要存储。
浮点数的表示中包括一类"特殊数值", 
即当指数的二进制位全为1时,这个浮点数被认为是"特殊数值", 
此时,若尾数的二进制位全为0,则表示无穷大,
1. 若符号位为1则为负无穷大;
2. 若符号位为0则为正无穷大; 
3. 若M的二进制位不全为0时,表示NaN(Not a Number),表示这不是一个合法实数或无穷,或者该数未经初始化.

规格化表示
十进制数的科学计数法
± a×10^n,其中1≤|a|<10,n为整数
例如
3×10^8,1×10^-2
有效数字
从左边不为0的数字开始...
890314000保留三位有效数字为8.90*10^8
839960000保留三位有效数字为8.40*10^8
0.00934593保留三位有效数字为9.35*10^-3
二进制数的科学计数法

二进制数的科学计数法
±1.m~m * 2 E e~e
- 12 = - (110)b
- 1.10 * 2 E 2
6.5 = (110.1)b
+ 1.101 * 2 E 2
0.3 = (0.010011001...)b
+ 1.0011001... * 2 E -2
The exponent field needs to represent both positive and negative exponents. To do this, a bias is added to the actual exponent in order to get the stored exponent. For IEEE single-precision floats, this value is 127. Thus, an exponent of zero means that 127 is stored in the exponent field. A stored value of 200 indicates an exponent of (200-127), or 73. For reasons discussed later, exponents of -127 (all 0s) and +128 (all 1s) are reserved for special numbers.
阶码
阶码部分采用移码表示,移码值为127,从而使阶码值的范围由原来的1到254,经移码后变为-126到+127。
由32位单精度所表示的IEEE 754标准浮点数N可以有如下的解释:
 若E=0,且M=0,则N为0。
 若E=0,且M≠0,则N=(-1)S·2-126·(0.M)。为非规格化数。
 若1≤E≤254,则N=(-1)S·2E-127·(1.M)。为规格化数。
 若E=255,且M≠0,则N=NaN(‘非数值’)。
 若E=255,且M=0,则N=(-1)S∝(无穷大)。
由此可见, IEEE 754标准使0有了精确表示,同时也明确地表示了无穷大,所以,当a/0(a≠0)时得到结果值为±∞;当0/0时得到结果值较小的数,为了避免下溢而损失精度,允许采用比最小规格化数还要小的数来表示,这些数称为非规格化数(Denormalnumber)。应注意的是,非规格化数和正、负零的隐含位值不是1而是0。

下面举两个例子来说明IEEE 754标准浮点数的表示:
(1)N=-1.5,它的单精度格式表示为:
  1 01111111 10000000000000000000000
 其中,S=1,E=127(0),M=0.5(1.5),因此N= -1.5。
 (2)以下的32位数所表示的单精度浮点数为多少?
  1 10000001 01000000000000000000000
 其中,S=1,E=129(2),M=0.25(1.25),由公式可知N= 1.25<<2 = -5。
 


自动转换
如果一个运算符两边的运算数类型不同,先要将其转换为相同的类型,然后再参加运算。
转换规则如下
double ←← float

unsigned long

long

unsigned

int ←← char, short
横向箭头表示必然的转换,即不管是否有不同类型参与运算都要转换。
纵向箭头表示表达式中出现不同类型时,较小类型(表示的最大数较小)向较大类型转换。

强制转换
赋值时发生的类型转换属于强制类型转换。
1、长整→短整
截断
2、有符号-无符号
内存复制
3、浮点数→整数
丢弃小数
4、整数→浮点数
0舍1入
eg:
// tip: sizeof(long) = 4
ulong ulv = 0xffffff80;
float fv = ulv;
// now fv = 1<<32
ulv = fv;
// now ulv = 0
最强势的转换是 & —— 取地址,然后转换。
 
阅读(776) | 评论(0) | 转发(0) |
0

上一篇:字节序

下一篇:结构与联合

给主人留下些什么吧!~~