文章目录
- 线索栏
- 笔记栏
-
- 2.1.2 字数据大小
-
- 1. 字长与虚拟地址空间
-
- 1)定义
- 2)核心影响
- 3)32位 vs. 64位迁移
- 2. C语言数据类型的大小(详见图2-3表格)
-
- 1)大小依赖
- 2)典型值总结
- 3)符号性
- 3. 可移植性与确定大小的类型
- 总结栏
线索栏
笔记栏
2.1.2 字数据大小
核心概念:计算机的字长(Word Size) 是系统的一个基本参数,它定义了指针数据的标称大小,并深刻影响虚拟地址空间的大小和C语言中多种数据类型的大小。
1. 字长与虚拟地址空间
1)定义
字长指明了指针数据的标称大小。
2)核心影响
(1)因为虚拟地址是用一个字来编码的,所以字长决定了虚拟地址空间的最大大小。 (2)对于字长为w位的机器,虚拟地址范围是0到2w-1, 程序最多可访问2w字节。
3)32位 vs. 64位迁移
(1)32位系统:虚拟地址空间限制为2的32(次方)字节 = 4 GB。 (2)64位系统:虚拟地址空间高达 2的64(次方)字节 = 16 EB(艾字节)。这是从大型机到智能手机的普遍趋势。 (3)向后兼容:大多数64位机器可以运行为32位编译的程序。
2. C语言数据类型的大小(详见图2-3表格)

1)大小依赖
数据类型的确切字节数依赖于程序是如何编译的(是编译为32位还是64位程序)。
2)典型值总结
(1)char: 1字节(可存储字符或小整数)。 (2)short: 2字节。 (3)int: 通常为4字节(即使在64位程序中)。 (4)long: 4字节(32位程序) 或 8字节(64位程序)。 (5)long long: 8字节。 (6)指针 (char *等): 4字节(32位程序) 或 8字节(64位程序),即使用程序的全字长。 (7)float(单精度): 4字节。 (8)double(双精度): 8字节。
3)符号性
(1)大多数数据类型默认是有符号的。 (2)使用 unsigned关键字可声明为无符号类型(如 unsigned int)。 (3)例外:char的符号性未由C标准定义,取决于编译器和机器。为保证是有符号字节,应明确使用 signed char。
3. 可移植性与确定大小的类型
(1)问题:C标准只规定了数据类型的最小范围,未规定确切大小,导致程序在不同字长机器间移植可能出现问题(例如,过去许多程序错误地假设 int可以存储指针)。 (2)解决方案:ISO C99 引入了固定大小的整数类型,如 int32_t和 int64_t,它们分别是 4字节 和 8字节。 (3)最佳实践:使用这些确定大小的类型是程序员精确控制数据表示的最佳途径,可增强程序的可移植性。
总结栏
本节明确了 字长(Word Size) 作为计算机系统的基础参数,其核心影响有二: 一是决定了虚拟地址空间的理论上限(32位4GB,64位16EB),二是影响了C语言中许多数据类型(尤其是 long和指针)的存储大小。
对于程序员而言,必须意识到数据类型大小并非绝对,它受制于目标机器的字长和编译选项。为了编写可移植的健壮代码,尤其是在从32位向64位迁移的背景下,应优先使用C99标准提供的 int32_t、int64_t 等固定大小类型,并警惕对指针和整数类型之间相互转换的隐含假设。
图2-3的表格是本节知识的视觉化核心,需要牢记32位与64位环境下关键类型的典型大小差异。
网硕互联帮助中心



评论前必须登录!
注册