虚拟地址空间
每个程序被运行起来后,都将拥有自己的独立虚拟地址空间,虚拟地址空间的大小由CPU的位数决定的。 比如32位的硬件平台决定了虚拟地址空间为4GB大小,对于一个字长为ω位的机器,虚拟地址的范围是 0 到 程序将内存视为一个非常大的数组,数组的元素是由一个个的字节组 成,每个字节都由一个唯一的数字来表示,我们称为地址(address),这些所有的地址的集合就称为虚拟地址空间(virtual address space)。
字数据大小
在 64 位的机器上,可以通过这条命令编译生 成可以在 32 位机器上运行的程序:
linux> gcc -m32 -o hello32 hello.c
通过修改编译选项,就可以编译生成在 64 位机器上运行的程序。
linux> gcc -m64 -o hello64 hello.c
hello32 既可以运行在 32 位机器上,也可以运行在 64 位机器上,但是 hello64 只能运行在64 位的机器上。
寻址和字节顺序
- 大端法:最高有效字节存储在最前面,也就是低地址处。一个 int 类型的变量 x(0x01234567)
- 小端法:最低有效字节存储在在最前面
大多数 Intel 兼容机采用小端模式,IBM 和 Sun 公司的机器大多数机器采用大端法。 对于很多新的处理器,支持双端法,可以配置成大端或者小端运行。例如基于 ARM 架构的处理器,支持双端法,但是 Android 系统和 iOS 系统却只能运行在小端模式
测试代码:
# include <stdio.h>
typedef unsigned char * byte_pointer;
void show_bytes( byte_pointer start,int len){
int i;
for(i = 0; i < len; i++){ printf(” %.2x” , start[i]);
}
printf(”\n”);
}
void show_int(int x){
show_bytes(( byte pointer) &x,sizeof(×));
}
数值信息的表示
原码方法很简单,但是用原码表示的数在计算机中进行加减法运算很麻烦。比如遇 到两个异号数相加或者两个同号数相减时,就要做减法。为了简化运算器的复杂性, 提高运算速度,需要把减法做成加法运算,因此人们引入了反码和补码。
反码
正数的反码与其原码相同; 负数的反码是在原码的基础上保持符号位不变,其余 各位按位求反得到的。
例如:X=+1010110, [X]反=[X]原=01010110.
Y=-0110101, [Y]原=10110101 [Y]反=11001010. .
补码
正数的补码与其原码相同; 负数的补码是在原码的基础上保持符号位不变,其它 的数位 1 变为 0,0 变为 1,最后再加 1 运算。也就是说,负数的补码是它的反码 加 1。在计算机中,有符号整数常常用补码形式存储5。
例如:X=+1010110 [X]补=[X]反=[X]原=01010110.
Y=-0110101 [Y]原=10110101 [Y]补=11001011.
对于任意一个数它的补码的补码是原码,即 [[X]补]补=[X]原.