高级语言提供了一些基本的数据类型。 例如,C/C++ 提供了 int 、char 、float 等。一些数据类型的大小如表所示:
Data type |
32-bit mode |
64-bit mode |
char |
8 |
8 |
int |
32 |
32 |
long |
32 |
64 |
long long |
64 |
64 |
float |
32 |
32 |
double |
64 |
64 |
*any |
32 |
64 |
上表:32 位和 64 位模式下某些 C/C++ 数据类型的大小(以位为单位)。 long 的大小取决于模式。 指针(地址)在 32 位模式下是 32 位,在 64 位模式下可以是 32 位或 64 位。
此表中给出的大小取自 System V 应用程序二进制接口规范,32 位参考文献 [33] 和 64 位参考文献 [25],并由 gcc 编译器用于 x86-64 架构。 为了适应其他硬件架构,语言规范往往更加宽松。 例如,有关 C 的规范,请参见参考文献 [10]。
一个给定的“真实世界”值通常可以用一种以上的数据类型来表示。 例如,大多数人会认为“123”代表“一百二十三”。 该值可以以 int 格式或作为文本字符串存储在计算机中。 我们的 C/C++ 环境中的 int 以 32 位存储,位模式为
0x0000007b
作为 C 风格的文本字符串,它还需要四个字节的内存,但它们的位模式将是
0x31 0x32 0x33 0x00
int 格式在算术和逻辑表达式中更容易使用,但通过屏幕和键盘与外界的界面使用 char 格式。 如果用户从键盘输入 123,操作系统将读取单个字符,每个字符都是 char 格式。 文本字符串必须转换为 int 格式。 对数字进行操作后,必须将结果从 int 格式转换为 char 格式才能显示在屏幕上。
C 程序员使用 stdio 库中的函数,C++ 程序员使用 iostream 库中的函数在 int 和 char 格式之间进行这些转换。 例如,C 代码序列
scanf("%i", &x);
x += 100;
printf("%i", x);
或 C++ 代码序列
cin >> x;
x += 100;
cout << x;
- 从键盘读取字符并将字符序列转换为相应的 int 格式。
- 将 100 添加到 int。
- 将生成的 int 转换为字符序列并将其显示在屏幕上。
上述代码段中的 C 或 C++ I/O 库函数在字符序列和 int 存储格式之间进行必要的转换。 但是,一旦执行转换,它们最终会调用 read 系统调用函数从键盘读取字节,并调用 write 系统调用函数将字节写入屏幕。 如图 3.2 所示,应用程序可以直接调用 read 和 write 函数来传输字节。
上图中:I/O 库与应用程序和操作系统的关系。 应用程序可以使用 I/O 库中的函数在键盘/屏幕字符和基本数据类型之间进行转换,也可以直接使用读/写系统调用来传输原始字节。
在 I/O 使用 read 和 write 系统调用函数时,程序员有责任在 I/O 使用的 char 类型和程序中使用的存储格式之间进行转换。 我们很快就会用汇编语言编写自己的函数,在用于屏幕显示和键盘输入的字符格式与二进制数系统中整数的内部存储格式之间进行转换。 编写我们自己的函数的目的是彻底了解数据在计算机内部是如何表示的。
小结:如果数值数据主要用于显示,很少有算术运算,那么以字符格式存储数值数据更有意义。 实际上,这是在许多业务数据处理环境中完成的。 但这使算术运算更加复杂。
|