F.2 数据表示法
任何给定数据元素的位编号取决于使用的体系结构:SPARCstation 机器将位 0 用作最低有效位,将字节 0 用作最高有效字节。本节中的表介绍各种表示法。
F.2.1 整数表示法
ISO C 中使用的整型有 short、int、long 和 long long:
表 F-2 short 的表示法
表 F-3 int 的表示法
表 F-4 使用 -m32 编译的 long 的表示法
表 F-5 long (-m64) 和 long long(-m32 和 -m64)
|
|
56- 63 |
|
48- 55 |
|
40- 47 |
|
32- 39 |
|
24- 31 |
|
16- 23 |
|
8- 15 |
|
0- 7 |
|
|
F.2.2 浮点表示法
float、double 和 long double 数据元素按照 ISO IEEE 754-1985 标准来表示。表示为:
(-1)s *2(e - bias) *[j.f]
其中:
对于 IEEE Single 和 Double,j 总是隐式的。偏置指数为 0 时, j 为 0,只要 f
不为 0,生成的数字就不太正常。偏置指数大于 0 时,只要该数字是有限的,j 就为 1。
对于 Intel 80 位 Extended,j 总是显式的。
下表显示各个位的位置。
表 F-6 float 表示法
|
|
31 |
符号 |
23- 30 |
偏置指数 |
0- 22 |
尾数部分 |
|
表 F-7 double 表示法
|
|
63 |
符号 |
52- 62 |
偏置指数 |
0- 51 |
尾数部分 |
|
表 F-8 long double 表示法 (SPARC)
|
|
127 |
符号 |
112- 126 |
偏置指数 |
0-
111 |
尾数部分 |
|
表 F-9 long double 表示法 (x86)
|
|
80- 95 |
不使用 |
79 |
符号 |
64- 78 |
偏置指数 |
63 |
前导位 |
0- 62 |
尾数部分 |
|
有关详细信息,请参阅《数值计算指南》。
F.2.3 异常值
float 和 double 数被认为包含一个“隐藏的”或隐含的位,从而比不包含该位时的精度高一位。对于 long double,前导位为隐式 (SPARC) 或显式 (x86);该位对于正规数为 1,对于非正规数为 0。
表 F-10 float 表示法
正规数 (0<e<255): |
(-1)s2 (e-127)1. f |
|
(-1)s2 (-126)0. f |
零 (e=0, f=0): |
(-1)s0.0 |
信号 NaN |
s=u,e=255(max);f=.0uuu-uu;至少一个位必须为非零 |
静态 NaN |
s=u,e=255(max);f=.1uuu-uu |
无穷 |
s=u,e=255(max);f=.0000-00(全为零) |
|
表 F-11 double 表示法
正规数 (0<e<2047): |
(-1)s2 (e-1023)1. f |
非正规数 (e=0, f!=0): |
(-1)s2 (-1022)0. f |
零 (e=0, f=0): |
(-1)s0.0 |
信号 NaN |
s=u,e=2047(max);f=.0uuu-uu;至少一个位必须为非零 |
静态 NaN |
s=u,e=2047(max);f=.1uuu-uu |
无穷 |
s=u,e=2047(max);f=.0000-00(全为零) |
|
表 F-12 long double 表示法
正规数
(0<e<32767): |
(-1)s2 (e- 16383)1.f |
非正规数 (e=0, f!=0): |
(-1)s2 (-16382)0. f |
零 (e=0, f=0): |
(-1)s0.0 |
信号 NaN |
s=u,e=32767(max);f=.0uuu-uu;至少一个位必须为非零 |
静态 NaN |
s=u,e=32767(max);f=.1uuu-uu |
无穷 |
s=u,e=32767(max);f=.0000-00(全为零) |
|
F.2.4 选定的数的十六进制表示
下表显示十六进制表示。
表 F-13 选定数的十六进制表示法 (SPARC)
|
|
|
|
|
|
0000000000000000 8000000000000000 |
00000000000000000000000000000000 80000000000000000000000000000000 |
|
|
3FF0000000000000 BFF0000000000000 |
3FFF00000000000000000000000000000 BFFF00000000000000000000000000000 |
|
|
4000000000000000 4008000000000000 |
40000000000000000000000000000000 40080000000000000000000000000000 |
|
|
7FF0000000000000 FFF0000000000000 |
7FFF00000000000000000000000000000 FFFF00000000000000000000000000000 |
NaN |
7FBFFFFF |
7FF7FFFFFFFFFFFF |
7FFF7FFFFFFFFFFFFFFFFFFFFFFFFFFF |
|
表 F-14 选定数的十六进制表示法 (x86)
|
|
|
|
|
|
0000000000000000 0000000080000000 |
00000000000000000000 80000000000000000000 |
|
|
000000003FF00000 00000000BFF00000 |
3FFF8000000000000000 BFFF8000000000000000 |
|
|
0000000040000000 0000000040080000 |
40008000000000000000 4000C000000000000000 |
|
|
000000007FF00000 00000000FFF00000 |
7FFF8000000000000000 FFFF8000000000000000 |
NaN |
7FBFFFFF |
FFFFFFFF7FF7FFFF |
7FFFBFFFFFFFFFFFFFFF |
|
有关详细信息,请参阅《数值计算指南》。
F.2.5 指针表示法
C 中的一个指针占 4 个字节。C 中的一个指针在 64 位 SPARC v9 体系结构中占 8 个字节。NULL
值指针等于零。
F.2.6 数组存储
数组及其元素按特定的存储顺序存储。元素实际上按存储元素的线性序存储。
C 数组按行主顺序存储。多维数组的最后一个下标变化最快。
字符串数据类型是 char 元素的数组。文本字符串或宽文本字符串(串联后)中允许的字符数最大值为 4,294,967,295。
有关堆栈中存储分配大小限制的信息,请参见F.1 存储分配。
表 F-15 数组类型和存储
|
|
|
char |
4,294,967,295 |
2,305,843,009,213,693,951 |
short |
2,147,483,647 |
1,152,921,504,606,846,975 |
int |
1,073,741,823 |
576,460,752,303,423,487 |
long |
1,073,741,823 |
288,230,376,151,711,743 |
float |
1,073,741,823 |
576,460,752,303,423,487 |
double |
536,870,911 |
288,230,376,151,711,743 |
long double |
268,435,451 |
144,115,188,075,855,871 |
long long |
536,870,911 |
288,230,376,151,711,743 |
|
静态数据和全局数组可以容纳更多元素。
F.2.7 异常值的算术运算
本节介绍了对异常和普通浮点值的组合应用基本算术运算所得的结果。以下信息假定不执行陷阱或任何其他异常操作。
下表解释缩写。
表 F-16 缩写用法
|
|
Num |
非正规数或正规数 |
Inf |
无穷(正或负) |
NaN |
不是数 |
Uno |
无序 |
|
下表描述对不同类型的操作数的组合执行算术运算所得值的类型。
表 F-17 加法和减法结果
|
|
|
|
|
左操作数: 0
|
0 |
Num |
Inf |
NaN |
左操作数: Num
|
Num |
|
Inf |
NaN |
左操作数: Inf
|
Inf |
Inf |
|
NaN |
左操作数: NaN
|
NaN |
NaN |
NaN |
NaN |
|
1结果太大(溢出)时,Num + Num 可能为 Inf 而不是 Num。无穷值具有相反的
sign 时,Inf + Inf = NaN。
表 F-18 乘法结果
|
|
|
|
|
左操作数: 0
|
0 |
0 |
NaN |
NaN |
左操作数: Num
|
0 |
Num |
Inf |
NaN |
左操作数: Inf
|
NaN |
Inf |
Inf |
NaN |
左操作数: NaN
|
NaN |
NaN |
NaN |
NaN |
|
表 F-19 除法结果
|
|
|
|
|
左操作数: 0
|
NaN |
0 |
0 |
NaN |
左操作数: Num
|
Inf |
Num |
0 |
NaN |
左操作数: Inf
|
Inf |
Inf |
NaN |
NaN |
左操作数: NaN
|
NaN |
NaN |
NaN |
NaN |
|
表 F-20 比较结果
|
|
|
|
|
左操作数: 0
|
= |
< |
< |
Uno |
左操作数: +Num
|
> |
比较的结果 |
< |
Uno |
左操作数: +Inf
|
> |
> |
= |
Uno |
左操作数: +NaN
|
Uno |
Uno |
Uno |
Uno |
|
注 - NaN 与 NaN 比较结果为无序,从而导致不相等。+0 与 - 0 的比较结果是相等。