收藏 分享(赏)

C语言的基本数据类型及其表示.pdf

上传人:weiwoduzun 文档编号:3627187 上传时间:2018-11-14 格式:PDF 页数:11 大小:201.48KB
下载 相关 举报
C语言的基本数据类型及其表示.pdf_第1页
第1页 / 共11页
C语言的基本数据类型及其表示.pdf_第2页
第2页 / 共11页
C语言的基本数据类型及其表示.pdf_第3页
第3页 / 共11页
C语言的基本数据类型及其表示.pdf_第4页
第4页 / 共11页
C语言的基本数据类型及其表示.pdf_第5页
第5页 / 共11页
点击查看更多>>
资源描述

1、3.2 C 语 言 的 基 本 数 据 类 型 及 其 表 示C 语 言 的 基 本 数 据 类 型 包 括 整 型 数 据 、 实 型 数 据 和 字 符 型 数 据 , 这 些 不 同 数据 类 型 如 何 表 示 ? 如 何 使 用 ? 它 们 的 数 据 范 围 是 什 么 ? 下 面 我 们 分 别 进 行 介 绍 。3.2.1 常 量 与 变 量1. 常 量常 量 是 指 程 序 在 运 行 时 其 值 不 能 改 变 的 量 , 它 是 语 言 中 使 用 的 基 本 数 据 对象 之 一 。 语 言 提 供 的 常 量 有 :以 上 是 常 量 所 具 有 的 类 型 属 性

2、, 这 些 类 型 决 定 了 各 种 常 量 所 占 存 储 空 间 的 大小 和 数 的 表 示 范 围 。 在 C 程 序 中 , 常 量 是 直 接 以 自 身 的 存 在 形 式 体 现 其 值 和 类型 , 例 如 : 123 是 一 个 整 型 常 量 , 占 两 个 存 储 字 节 , 数 的 表 示 范 围 是 -32768 32767;123.0 是 实 型 常 量 , 占 四 个 存 储 字 节 , 数 的 表 示 范 围 是 -3.410-38 3.41038。需 要 注 意 的 是 , 常 量 并 不 占 内 存 , 在 程 序 运 行 时 它 作 为 操 作 对 象

3、 直 接 出 现 在运 算 器 的 各 种 寄 存 器 中 。2.符 号 常 量在 C 程 序 中 , 常 量 除 了 以 自 身 的 存 在 形 式 直 接 表 示 之 外 , 还 可 以 用 标 识 符来 表 示 常 量 。 因 为 经 常 碰 到 这 样 的 问 题 : 常 量 本 身 是 一 个 较 长 的 字 符 序 列 , 且在 程 序 中 重 复 出 现 , 例 如 : 取 常 数 的 值 为 3.1415927, 如 果 在 程 序 中 多 处 出 现 ,直 接 使 用 3.1415927 的 表 示 形 式 , 势 必 会 使 编 程 工 作 显 得 繁 琐 , 而 且 ,

4、当 需 要 把的 值 修 改 为 3.1415926536 时 , 就 必 须 逐 个 查 找 并 修 改 , 这 样 , 会 降 低 程 序 的 可修 改 性 和 灵 活 性 。 因 此 , 语 言 中 提 供 了 一 种 符 号 常 量 , 即 用 指 定 的 标 识 符 来 表示 某 个 常 量 , 在 程 序 中 需 要 使 用 该 常 量 时 就 可 直 接 引 用 标 识 符 。 语 言 中 用 宏 定 义 命 令 对 符 号 常 量 进 行 定 义 , 其 定 义 形 式 如 下 :#define 标 识 符 常 量其 中 #define 是 宏 定 义 命 令 的 专 用 定

5、义 符 , 标 识 符 是 对 常 量 的 命 名 , 常 量 可以 是 前 面 介 绍 的 几 种 类 型 常 量 中 的 任 何 一 种 。 该 使 指 定 的 标 识 符 来 代 表 指 定 的 常量 , 这 个 被 指 定 的 标 识 符 就 称 为 符 号 常 量 。 例 如 , 在 C 程 序 中 , 要 用 PAI代 表实 型 常 量 3.1415927, 用 W 代 表 字 符 串 常 量 “Windows98“, 可 用 下 面 两 个 宏定 义 命 令 :#definePAI3.1415927#defineW“Windows98“宏 定 义 的 功 能 是 : 在 编 译

6、预 处 理 时 , 将 程 序 中 宏 定 义 ( 关 于 编 译 预 处 理 和 宏定 义 的 概 念 详 见 9.10 节 ) 命 令 之 后 出 现 的 所 有 符 号 常 量 用 宏 定 义 命 令 中 对 应 的常 量 一 一 替 代 。 例 如 , 对 于 以 上 两 个 宏 定 义 命 令 , 编 译 程 序 时 , 编 译 系 统 首 先 将程 序 中 除 这 两 个 宏 定 义 命 令 之 外 的 所 有 PAI 替 换 为 3.1415927, 所 有 W 替 换 为Windows98。 因 此 , 符 号 常 量 通 常 也 被 称 为 宏 替 换 名 。习 惯 上 人

7、们 把 符 号 常 量 名 用 大 写 字 母 表 示 , 而 把 变 量 名 用 小 写 字 母 表 示 。 例3-1 是 符 号 常 量 的 一 个 简 单 的 应 用 。 其 中 , PI 为 定 义 的 符 号 常 量 , 程 序 编 译 时 ,用 3.1416 替 换 所 有 的 PI。例 3-1: 已 知 圆 半 径 r, 求 圆 周 长 c 和 圆 面 积 s 的 值 。#definePI3.1416main()floatr,c,s;scanf(“%d“,c=2*PI*r;/* 编 译 时 用 3.1416 替 换 PI*/s=PI*r*r;/* 编 译 时 用 3.1416 替

8、 换 PI*/printf(“c=%6.2f,s=%6.2fn“,c,s);3.变 量变 量 是 程 序 设 计 语 言 中 一 个 重 要 概 念 , 它 是 指 在 程 序 运 行 时 其 值 可 以 改 变 的量 。 这 里 所 说 的 变 量 与 数 学 中 的 变 量 是 完 全 不 同 的 概 念 。 在 C 语 言 以 及 其 他 各种 常 规 程 序 设 计 语 言 中 , 变 量 是 表 述 数 据 存 储 的 基 本 概 念 。 我 们 知 道 , 在 计 算 机硬 件 的 层 次 上 , 程 序 运 行 时 数 据 的 存 储 是 靠 内 存 储 器 、 存 储 单 元

9、、 存 储 地 址 等 一系 列 相 关 机 制 实 现 , 这 些 机 制 在 程 序 语 言 中 的 反 映 就 是 变 量 的 概 念 。程 序 里 的 一 个 变 量 可 以 看 成 是 一 个 存 储 数 据 的 容 器 , 它 的 功 能 就 是 可 以 存 储数 据 。 对 变 量 的 基 本 操 作 有 两 个 : 向 变 量 中 存 入 数 据 值 , 这 个 操 作 被 称 作 给变 量 “赋 值 “。 取 得 变 量 当 前 值 , 以 便 在 程 序 运 行 过 程 中 使 用 , 这 个 操 作 称 为 “取 值 “。 变 量 具 有 保 持 值 的 性 质 , 也

10、就 是 说 : 如 果 在 某 个 时 刻 给 某 变 量 赋 了 一 个值 , 此 后 使 用 这 个 变 量 时 , 每 次 得 到 的 将 总 是 这 个 值 。因 为 要 对 变 量 进 行 “赋 值 “和 “取 值 “操 作 , 所 以 程 序 里 的 每 个 变 量 都 要 有 一 个变 量 名 , 程 序 是 通 过 变 量 名 来 使 用 变 量 的 。 在 C 语 言 中 , 变 量 名 是 作 为 变 量 的标 识 , 其 命 名 规 则 符 合 标 识 符 的 所 有 规 定 。 以 下 是 合 法 的 变 量 名 :f1totalname_1_sumave1r123st

11、u_12_1stu_namex1x1_piyear 语 言 提 供 的 基 本 变 量 类 型 有 :C 语 言 要 求 : 程 序 里 使 用 的 每 个 变 量 都 必 须 首 先 定 义 , 也 就 是 说 , 首 先 需 要声 明 一 个 变 量 的 存 在 , 然 后 才 能 够 使 用 它 。 要 定 义 一 个 变 量 需 要 提 供 两 方 面 的 信息 : 变 量 的 名 字 和 它 的 类 型 , 其 目 的 是 由 变 量 的 类 型 决 定 变 量 的 存 贮 结 构 , 以 便使 C 语 言 的 编 译 程 序 为 所 定 义 的 变 量 分 配 存 储 空 间 。4

12、.变 量 的 定 义变 量 是 以 标 识 符 的 形 式 来 表 示 其 类 型 。 在 C 语 言 中 , 是 用 类 型 说 明 语 句 对变 量 进 行 定 义 , 其 定 义 形 式 如 下 :类 型 说 明 符 变 量 名 表 ;其 中 , 类 型 说 明 符 是 语 言 中 的 一 个 有 效 的 数 据 类 型 , 如 整 型 类 型 说 明 符int, 字 符 型 类 型 说 明 符 char 等 。 变 量 表 的 形 式 是 : 变 量 名 1, 变 量 名 2, ,变 量 名 n, 即 : 用 逗 号 分 隔 的 变 量 名 的 集 合 。 最 后 用 一 个 分 号

13、结 束 定 义 。 定 义 变量 的 这 种 语 言 结 构 称 为 “变 量 说 明 “, 例 如 下 面 是 某 程 序 中 的 变 量 说 明 :inta,b,c;/* 说 明 a,b,c 为 整 型 变 量 */charcc;/* 说 明 cc 为 字 符 变 量 */doublex,y;/* 说 明 x,y 为 双 精 度 实 型 变 量 */可 见 , 一 个 定 义 中 可 以 说 明 多 个 变 量 。 而 且 , 由 于 C 语 言 是 自 由 格 式 语 言 ,把 多 个 变 量 说 明 写 在 同 一 行 也 是 允 许 的 。 但 是 为 了 程 序 清 晰 , 人 们

14、 一 般 不 采 用 这种 写 法 , 尤 其 是 初 学 者 。 在 C 程 序 中 , 除 了 不 能 用 关 键 字 做 变 量 名 外 , 可 以 用任 何 标 识 符 做 变 量 名 。 但 是 , 一 般 提 倡 用 能 说 明 变 量 用 途 的 有 意 义 的 名 字 为 变 量命 名 , 因 为 这 样 的 名 字 对 读 程 序 的 人 有 一 定 提 示 作 用 , 有 助 于 提 高 程 序 的 可 读 性 ,尤 其 是 当 程 序 比 较 大 , 程 序 中 的 变 量 比 较 多 时 , 这 一 点 就 显 得 尤 其 重 要 。 这 就 是结 构 化 程 序 设

15、计 所 强 调 的 编 程 风 格 问 题 。 在 数 学 里 人 们 常 常 采 取 对 变 量 简 单 命 名的 方 式 , 那 是 因 为 数 学 公 式 里 使 用 的 变 量 通 常 都 很 少 。 程 序 的 情 况 则 不 同 , 一 个大 程 序 里 可 能 有 成 百 成 千 的 变 量 , 命 名 问 题 就 显 得 重 要 。整 型 数 据 及 其 表 示1.整 数 类 型C 语 言 提 供 了 多 种 整 数 类 型 , 用 以 适 应 不 同 情 况 的 需 要 。 常 用 的 整 数 类 型 有 :整 型 、 长 整 型 、 无 符 号 整 型 和 无 符 号 长

16、整 型 等 四 种 基 本 类 型 。 不 同 类 型 的 差 别 就在 于 采 用 不 同 位 数 的 二 进 制 编 码 方 式 , 所 以 就 要 占 用 不 同 的 存 储 空 间 , 就 会 有 不同 的 数 值 表 示 范 围 。 表 3-1 列 出 了 常 用 的 基 本 整 数 类 型 和 有 关 数 据 。在 数 学 中 , 整 数 是 一 个 无 限 的 集 合 , 即 整 数 的 表 示 范 围 为 - +。 语 言标 准 本 身 也 并 不 限 制 各 种 类 型 数 据 所 占 的 存 储 字 节 数 。 但 在 计 算 机 中 , 所 有 数 值的 取 值 范 围

17、受 限 于 机 器 所 能 表 示 的 范 围 , 不 同 的 计 算 机 系 统 对 数 数 据 的 存 储 有 具体 的 规 定 。 表 3-1 列 出 了 IBMPC 机 及 其 兼 容 机 上 对 C 语 言 整 型 数 的 规 定 , 表 中的 存 储 字 节 数 和 最 小 数 值 范 围 表 示 相 应 类 型 的 整 数 不 能 低 于 此 值 但 可 高 于 此 值 。表 3-1 整 数 基 本 类 型 表整 数 类 型 存 储 字 节 最 小 数 值 范 围整 型 2 字 节 -32768 32767长 整 型 4 字 节 -2147483648 2147483647无 符

18、 号 整 型 2 字 节 0 65535无 符 号 长 整 型 4 字 节 0 4294967295计 算 机 内 部 总 是 采 用 二 进 制 补 码 形 式 表 示 一 个 数 值 型 数 据 , 所 以 对 于 带 符 号的 数 , 其 负 数 的 表 示 范 围 比 正 数 大 , 请 读 者 注 意 这 一 点 。 表 3-2 中 的 整 型 和 长 整型 均 表 示 带 符 号 的 整 型 数 据 , 一 个 带 符 号 整 数 和 无 符 号 整 数 在 计 算 机 中 的 存 储 形式 是 不 同 的 , 其 示 意 图 如 图 3-1 所 示 。 例 如 , 长 整 型 不

19、 可 少 于 四 个 字 节 , 但 可 以是 八 个 字 节 。图 中 的 整 型 数 和 无 符 号 整 型 数 都 是 用 两 个 字 节 ( 16 位 二 进 制 数 ) 表 示 , 整型 数 的 最 高 位 为 符 号 位 , “1“表 示 负 数 , “0“表 示 正 数 , 用 其 余 15 位 表 示 数 值 。而 无 符 号 整 型 数 全 部 16 位 表 示 数 值 。2.整 型 常 量在 计 算 机 语 言 中 , 常 量 一 般 是 以 自 身 的 存 在 形 式 直 接 表 示 数 据 属 性 , C 语 言亦 如 此 。 例 如 : -35 是 十 进 制 整 型

20、 常 数 , 应 占 两 个 字 节 的 存 储 空 间 , 而 -35.0 是 十进 制 实 型 常 数 , 占 四 个 字 节 的 存 储 空 间 。在 C 语 言 中 , 所 有 的 数 值 型 常 量 都 带 有 符 号 , 所 以 整 型 常 量 只 区 别 整 型 和长 整 型 两 种 形 式 , 而 没 有 无 符 号 值 型 常 量 。 整 型 和 长 整 型 常 量 均 可 用 十 进 制 、 八进 制 和 十 六 进 制 三 种 形 式 表 示 。(1) 十 进 制 整 型 常 量十 进 制 整 型 常 量 的 形 式 是 有 效 的 十 进 制 数 字 串 。 如 : 1

21、23, -123, 8, 0, -5,30000 等 。 40000 则 不 是 一 个 十 进 制 整 型 常 量 , 因 为 它 超 过 了 整 型 常 量 的 表 示 范围 。 对 于 这 种 超 过 数 值 表 示 范 围 的 数 据 , 语 言 系 统 会 自 动 将 其 转 换 为 其 它 适 合 的类 型 。(2) 八 进 制 整 型 常 量八 进 制 整 型 常 量 的 形 式 是 以 数 字 “0“开 头 的 八 进 制 数 字 串 。 数 字 串 中 只 能 含有 0 7 这 八 个 数 字 。如 : 056 表 示 八 进 制 数 56, 等 于 十 进 制 数 46。-

22、017 表 示 八 进 制 数 -17, 等 于 十 进 制 数 -15。(3) 十 六 进 制 整 型 常 量十 六 进 制 整 型 常 量 的 形 式 是 以 数 字 0x 或 0X 开 头 的 十 六 进 制 字 符 串 。 字 符串 中 只 能 含 有 0 9 这 十 个 数 字 和 、 、 、 、 、 ( 或 大 写 的 、 、 、 、 、 ) 这 六 个 字 母 。 这 一 规 定 与 计 算 机 领 域 中 通 行 的 表 示 十 六 进 制 字符 方 式 相 同 。如 : 0x123 表 示 十 六 进 制 数 123, 等 于 十 进 制 数 291。0x3A 表 示 十 六

23、 进 制 数 3A, 等 于 十 进 制 数 58。-0x2e 表 示 十 六 进 制 数 -2f, 等 于 十 进 制 数 -46。以 上 是 整 型 常 数 的 表 示 , 对 于 长 整 型 常 数 同 样 可 以 用 十 进 制 、 八 进 制 和 十 六进 制 三 种 形 式 表 示 。 其 表 示 形 式 是 在 常 数 之 后 加 上 字 母 “ “或 “ “。 例 如 : 123L,-1234567L, 0l, 32769L, -017l, -0x123BL, 0Xf3acL, -0x2eL 都 是 长 整 型 常 数 。长 整 型 常 数 在 计 算 机 中 占 4 个 字

24、节 , 数 的 表 示 范 围 可 达 到 -21474836482147483647。 所 以 尽 管 40000 不 是 一 个 合 法 的 十 进 制 整 型 常 量 , 但 40000L 是 一个 合 法 的 十 进 制 长 整 型 常 量 。 长 整 型 常 数 一 般 是 用 于 函 数 调 用 中 。3.整 型 变 量在 C 语 言 中 , 整 型 变 量 有 上 述 整 型 数 据 所 具 有 的 四 种 类 型 : 整 型 、 长 整 型 、无 符 号 整 型 和 无 符 号 长 整 型 。 整 型 变 量 以 关 键 字 int 作 为 基 本 类 型 说 明 符 , 另

25、外配 合 个 类 型 修 饰 符 , 用 来 改 变 和 扩 充 基 本 类 型 的 含 义 , 以 适 应 更 灵 活 的 应 用 。可 作 用 于 基 本 型 int 上 的 个 类 型 修 饰 符 有 :long 长short 短signed 有 符 号unsigned 无 符 号这 些 修 饰 符 与 int 可 以 组 合 成 如 表 3-2 所 示 的 不 同 整 数 类 型 , 这 是 ANSIC标 准 允 许 的 整 数 类 型 。 由 表 中 可 见 , 有 些 修 饰 符 是 多 余 的 , 例 如 修 饰 符 signed和 short 就 是 不 必 要 的 , 因 为

26、 signedint、 shortint、 signedshortint 与 int 类 型 都 是等 价 的 。 提 出 这 些 修 饰 符 只 是 为 了 提 高 程 序 的 可 读 性 。 因 为 signed 与 unsigned对 应 , short 与 long对 应 , 使 用 它 会 使 程 序 看 起 来 更 加 明 了 。表 3-2ANSI 标 准 规 定 的 整 型 变 量 属 性 表数 据 类 型 占 用 字 节 数 二 进 制 位 取 值 范 围int 16-32768 32767shortint 16 同 intlongint 32-2147483648 21474

27、83647signedint 16 同 intsignedshortint 16 同 intsignedlongint 32 同 longintunsignedint 160 65535unsignedshortint 16 同 unsignedintunsignedlongint 320 4294967295前 面 已 经 提 到 , 一 个 程 序 中 用 到 的 所 有 变 量 都 必 须 在 使 用 前 进 行 变 量 说明 。 一 是 说 明 变 量 类 型 , 二 是 说 明 变 量 名 。 对 于 程 序 中 要 说 明 为 整 型 的 变 量 , 只需 在 说 明 语 句 中

28、指 明 整 型 数 据 类 型 和 相 应 的 变 量 名 即 可 。例 如 : inta,b,c;/* 说 明 a,b,c 为 整 型 变 量 */longe,f;/* 说 明 e,f 为 长 整 型 变 量 */unsignedshortg,h;/* 说 明 g,h 为 无 符 号 短 整 型 变 量 */signedintx,y; * 说 明 x,y,z 为 带 符 号 整 型 变 量 , 其 作 用 同 intx,y*/4.整 型 数 据 应 用 中 的 几 个 问 题整 型 数 据 在 使 用 中 应 注 意 以 下 几 个 问 题 :(1) 变 量 要 先 定 义 后 使 用 ;(

29、2) 数 据 溢 出 ;(3) 常 量 与 变 量 的 类 型 要 匹 配 。下 面 通 过 一 个 简 单 的 程 序 实 例 讨 论 以 上 三 个 问 题 。例 3-1: 编 写 求 两 数 和 的 C 程 序 并 上 机 运 行 。 程 序 如 下 :/*SUM.C 源 程 序 */main()/* 求 两 数 和 主 函 数 */inta,b;/* 说 明 a、 b 为 整 型 变 量 */a=32767;/* 为 变 量 a 赋 最 大 值 */b=3;/* 为 变 量 b 赋 值 */c=a+b;/* 计 算 a+b 并 将 结 果 赋 值 给 变 量 c*/printf(“c=

30、%dn“,c);/* 输 出 变 量 c 的 值 */讨 论 1: 在 TurboC2.0开 发 环 境 下 运 行 此 程 序 时 , 编 译 过 程 中 提 示 有 一 个 错误 , 信 息 窗 口 显 示 如 图 3-2 所 示 的 错 误 信 息 , 说 明 源 程 序 第 五 行 有 错 , 错 误 原 因是 主 程 序 中 的 变 量 C 没 有 定 义 。 编 辑 窗 口 源 程 序 反 相 显 示 出 第 五 行 , 见 图 3-3所 示 。 分 析 错 误 原 因 可 知 , 程 序 第 五 行 并 没 有 错 , 而 是 在 使 用 变 量 c 之 前 没 有 定义 其 类

31、 型 , 修 改 程 序 第 二 行 为 :inta,b,c;重 新 编 译 即 可 通 过 。 可 见 , C 程 序 中 的 所 有 变 量 都 必 须 先 定 义 后 使 用 。讨 论 2: 由 SUM.C 源 程 序 可 见 , 该 程 序 的 运 行 结 果 应 该 是 : c=32770, 可 实际 运 行 结 果 如 下 :c=-32766显 然 这 个 结 果 是 错 误 的 , 但 系 统 没 有 提 示 出 错 。 为 什 么 会 出 现 这 种 情 况 呢 ?图 3-4 是 该 程 序 运 行 后 变 量 a、 b、 c 中 的 存 储 情 况 。 由 图 中 可 见 ,

32、 a 和 b 的 值 都没 有 超 出 整 型 数 的 表 示 范 围 , 而 a 加 b 后 应 得 到 32770, 这 个 数 已 经 超 出 了 整 型数 的 表 示 范 围 , 称 为 溢 出 。 但 这 种 溢 出 在 内 存 变 量 c 中 的 表 现 形 式 正 好 是 数 值-32766 的 补 码 形 式 , 当 输 出 变 量 c 的 内 容 时 自 然 就 输 出 了 -32766, 造 成 结 果 错 误 。这 就 是 数 据 溢 出 导 致 的 结 果 。 对 于 这 种 问 题 , 系 统 往 往 不 给 出 错 误 提 示 , 而 是 要靠 正 确 使 用 类

33、型 说 明 来 保 证 其 正 确 性 。 所 以 要 求 对 数 据 类 型 的 使 用 要 仔 细 , 对 运算 结 果 的 数 量 级 要 有 基 本 估 计 。如 果 把 上 述 程 序 作 以 下 修 改 :/*SUM.C 源 程 序 */main()longa,b,c;/* 说 明 a、 b、 c 为 长 整 型 变 量 */a=32767;b=3;c=a+b;printf(“c=%ldn“,c);/* 按 长 整 型 格 式 输 出 变 量 c 的 值 */即 把 变 量 a、 b、 c 定 义 为 长 整 型 , 就 可 以 得 到 正 确 的 运 行 结 果 。 请 读 者

34、思 考 :如 果 只 把 c 定 义 为 长 整 型 , a 和 b 还 保 持 整 型 , 结 果 会 怎 样 ?讨 论 3: 在 C 程 序 中 , 要 注 意 常 量 与 变 量 的 类 型 匹 配 问 题 , 例 如 上 述 程 序 中变 量 c 的 结 果 是 正 整 数 32770, 与 之 匹 配 的 有 longint 型 , 还 有 unsignedint、unsignedshortint 和 unsignedlongint 等 所 有 无 符 号 整 型 , 因 为 32770 是 正 数 , 又没 有 超 出 所 有 无 符 号 整 型 数 的 表 示 范 围 。 而 i

35、nt 或 shortint 型 是 不 能 与 之 匹 配 的 ,否 则 会 产 生 溢 出 。3.2.3 实 型 数 据 及 其 表 示1.实 数 类 型C 语 言 提 供 了 三 种 用 于 表 示 实 数 的 类 型 : 单 精 度 型 、 双 精 度 型 和 长 双 精 度 型 。表 3-3 列 出 了 实 型 数 据 的 长 度 和 表 示 范 围 。 表 中 的 有 效 位 是 指 数 据 在 计 算 机 中 存储 和 输 出 时 能 够 精 确 表 示 的 数 字 位 数 。表 3- 实 数 基 本 类 型 表实 数 类 型 存 储 字 节 数 最 小 数 值 范 围 有 效 位

36、单 精 度 型 4 字 节 10-38 10386 7双 精 度 型 8 字 节 10-308 1030815 16长 双 精 度 型 16 字 节 10-4931 10493218 19在 计 算 机 中 , 实 数 是 以 浮 点 数 形 式 存 储 的 , 所 以 通 常 将 单 精 度 实 数 称 为 浮 点数 。 由 计 算 机 基 础 知 道 , 浮 点 数 在 计 算 机 中 是 按 指 数 形 式 存 储 的 , 即 把 一 个 实 型数 据 分 成 小 数 和 指 数 两 部 分 。 例 如 十 进 制 实 型 数 据 0.12345610-2 在 计 算 机 中 的存 放

37、形 式 可 用 图 3-5 示 意 。 实 际 上 计 算 机 中 存 放 的 是 二 进 制 数 , 这 里 仅 用 十 进 制数 说 明 其 存 放 形 式 。其 中 , 小 数 部 分 一 般 都 采 用 规 格 化 的 数 据 形 式 , 即 : 小 数 点 放 在 第 一 个 有 效数 字 前 面 , 使 小 数 部 分 存 放 小 于 1 的 纯 小 数 。 例 如 0.12345610-2 还 可 表 示 为123.45610-5、 1.2345610-3、 0.000123456101 等 , 但 这 些 都 不 是 规 格 化 的 数 。表 示 小 数 部 分 的 位 数 愈

38、 多 , 数 的 有 效 位 就 愈 多 , 数 的 精 确 度 就 愈 高 。 表 示 指数 部 分 的 位 数 愈 多 , 数 的 表 示 范 围 就 愈 大 。 究 竟 用 多 少 位 来 表 示 小 数 部 分 , 多 少位 表 示 指 数 部 分 , C 标 准 对 此 并 无 具 体 规 定 , 由 各 C 编 译 系 统 自 定 。 对 于 单 精 度实 数 , 一 般 的 C 编 译 系 统 用 4 个 字 节 中 的 前 24 位 表 示 小 数 部 分 , 其 中 最 高 位 为整 个 数 的 符 号 位 , 用 后 8 位 表 示 指 数 部 分 , 其 中 最 高 位

39、为 指 数 的 符 号 位 ( 见 图3-5) 。 这 样 , 单 精 度 实 数 的 精 度 就 取 决 于 小 数 部 分 的 23 位 二 进 制 数 位 所 能 表 达的 数 值 位 数 , 将 其 转 换 为 十 进 制 , 最 多 可 表 示 7 位 十 进 制 数 字 , 所 以 单 精 度 实 数的 有 效 位 是 7 位 。由 实 型 数 据 的 存 储 形 式 可 见 , 由 于 机 器 存 储 位 数 的 限 制 , 浮 点 数 都 是 近 似 值 ,而 且 多 个 浮 点 数 运 算 后 误 差 累 积 很 快 , 所 以 引 进 了 双 精 度 型 和 长 双 精 度

40、 型 , 用 于扩 大 存 储 位 数 , 目 的 是 增 加 实 数 的 长 度 , 减 少 累 积 误 差 , 改 善 计 算 精 度 。2.实 型 常 量实 型 常 量 亦 被 称 为 实 型 数 或 浮 点 数 。 在 语 言 中 , 实 型 常 量 一 般 都 作 为 双 精度 来 处 理 , 并 且 只 用 十 进 制 数 表 示 。 实 型 常 量 有 两 种 书 写 格 式 : 小 数 形 式 和 指 数形 式 。( 1) 小 数 形 式 : 它 由 符 号 、 整 数 部 分 、 小 数 点 及 小 数 部 分 组 成 。 例 如 以 下都 是 合 法 的 小 数 形 式 实

41、 型 常 量 :12.34, 0.123, .123, 123., -12.0, -0.0345, 0.0, 0.注 意 其 中 任 何 位 置 上 的 小 数 点 都 是 不 可 缺 少 的 。 例 如 123.不 能 写 成 123, 因 为 123是 整 型 常 量 , 而 123.是 实 型 常 量 。( 2) 指 数 形 式 : 由 十 进 制 小 数 形 式 加 上 指 数 部 分 组 成 , 其 形 式 如 下 :十 进 制 小 数 e 指 数 或 : 十 进 制 小 数 E 指 数格 式 中 的 e 或 E 前 面 的 数 字 表 示 尾 数 , e 或 E 表 示 底 数 1

42、0, 而 e 或 E 后 面的 指 数 必 须 是 整 数 , 表 示 10 的 幂 次 。 例 如 25.34e3 表 示 25.34103=25340。 以 下都 是 合 法 的 指 数 形 式 实 型 常 量 :2.5e3, -12.5e-5, 0.123E-5, -267.89E-6, 0.61256e3注 意 指 数 必 须 是 不 超 过 数 据 表 示 范 围 的 正 负 整 数 , 并 且 在 e 或 E 前 必 须 有 数字 。 例 如 :e3, 3.0e, E-9, 10e3.5, .e8, e 都 是 不 合 法 的 指 数 形 式 。对 于 上 述 两 种 书 写 形

43、式 , 系 统 均 默 认 为 是 双 精 度 实 型 常 量 , 可 表 示 15 16位 有 效 数 字 , 数 的 表 示 范 围 可 达 到 10-308 10308。 如 果 要 表 示 单 精 度 实 型 常量 和 长 双 精 度 实 型 常 量 , 只 要 在 上 述 书 写 形 式 后 分 别 加 上 后 缀 f(F)或 l( L) 即 可 。例 如 :2.3f, -0.123F, 2e-3f, -1.5e4F 为 合 法 的 单 精 度 实 型 常 量 , 注 意 只 有 7 位 有效 数 字 。1256.34L, -0.123L, 2e3L, 为 合 法 的 长 双 精 度

44、 实 型 常 量 , 有 18 19 位 有 效数 字 。对 于 超 过 有 效 数 字 位 的 数 位 , 系 统 存 储 时 自 动 舍 去 。3.实 型 变 量在 C 语 言 中 , 实 型 变 量 分 为 单 精 度 、 双 精 度 和 长 双 精 度 等 三 种 类 型 。 ANSIC标 准 允 许 的 定 义 三 种 实 型 变 量 的 关 键 字 如 下 :float 单 精 度 型double 双 精 度 型longdouble 长 双 精 度 型实 型 变 量 的 定 义 , 只 需 在 说 明 语 句 中 指 明 实 型 数 据 类 型 和 相 应 的 变 量 名 即可 。

45、例 如 : floata,b;/* 说 明 变 量 a,b 为 单 精 度 型 实 数 */doublec,d;/* 说 明 变 量 c,d 为 双 精 度 型 实 数 */longdoublee,f/* 说 明 变 量 e,f 为 长 双 精 度 型 实 数 */4.实 型 数 据 应 用 中 的 误 差 问 题例 3-2: 输 出 实 型 数 据 a,b/*L3_2.C 源 程 序 */main()floata;/* 说 明 变 量 a 为 单 精 度 型 */doubleb;/* 说 明 变 量 b 为 双 精 度 型 */a=12345.6789;/* 为 a 赋 值 */b=0.12

46、34567891234567899e15;/* 为 b 赋 值 */printf(“a=%f,b=%fn“,a,b);/* 输 出 变 量 a、 b 的 值 */程 序 为 单 精 度 变 量 a 和 双 精 度 变 量 b 分 别 赋 值 , 并 不 经 过 任 何 运 算 就 直 接 输出 变 量 a,b 的 值 。 理 想 结 果 应 该 是 照 原 样 输 出 , 即 :a=12345.6789, b=0.1234567891234567899e15但 运 行 该 程 序 , 实 际 输 出 结 果 是 :a=12345.678711, b=123456789123456.797000

47、由 于 实 型 数 据 的 有 效 位 是 有 限 的 , 程 序 中 变 量 a 为 单 精 度 型 , 只 有 7 位 有 效数 字 , 所 以 输 出 的 前 8 位 是 准 确 的 , 第 9 位 以 后 的 数 字 “711“是 无 意 义 的 。 变 量 b为 双 精 度 型 , 可 有 15 16 位 的 有 效 位 , 所 以 输 出 的 前 16 位 是 准 确 的 , 第 17 位以 后 的 数 字 “97000“是 无 意 义 的 。 由 此 可 见 , 由 于 机 器 存 储 的 限 制 , 使 用 实 型 数据 会 产 生 一 些 误 差 , 运 算 次 数 愈 多 , 误 差 积 累 就 愈 大 , 所 以 要 注 意 实 型 数 据 的 有效 位 , 合 理 使 用 不 同 的 类 型 , 尽 可 能 减 少 误 差 。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > C/C++资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报