玩命加载中 . . .

2.1-信息的存储


2.1 信息的存储

通常情况下,程序将内存视为一个非常大的数组,数组的元素是由一个个的字节Byte组成,每个字节都有一个唯一的数字来表示,称为地址address,所有地址的集合称为虚拟地址空间

2.1.1 进制

1个字节由8个位bit组成,用十进制来表示范围是:0~255,这种按照一位一位表示数据的方式称为位模式,使用二进制太冗长,所以引入十六进制

十六进制以0X0x开头

快速将2的n次方表示为十六进制数
20 = 1
21 = 10
22 = 100
23 = 1000
所以2的n次方就是1后面跟n个0,n可以表示为i+4j,就是除以4,i为余数,j为商,i只有三种情况,0对应0B->0H,1对应10B->2H,2对应100B->4H,3对应1000B->8H,后面再跟j个0
例如:211,因为11=3+4*2,所以是0x800

C语言支持整数和浮点数等多种数据类型,表格中列出了不同数据类型在32位机器和64位机器上所占字节数的大小

例如一个4字节的int变量0x01234567,所以需要占用0x1000x1010x1020x103四个字节内存空间

大端法:最高有效字节存储在低地址处,所以是01 23 45 67
小端法:最低有效字节存储在低地址处,所以是67 45 23 01

#include <stdio.h>

typedef unsigned char* byte_pointer;

void show_bytes(byte_pointer start, int len) {
    for (int i = 0; i < len; i++)
        printf(" %.2x", start[i]);   // 两位十六进制
    printf("\n");
}

void show_int(int x) {
    show_bytes((byte_pointer)& x, sizeof(x));
}

int main() {
    int x = 0x01234567;
    show_int(x);
    return 0;
}
//  67 45 23 01

从程序运行结果可以看出来是小端模式

2.1.2 移位操作

左移就是简单地左移,右端补0

右移分为逻辑右移算术右移

  • 逻辑右移左端补0
  • 算术右移
    • 最高位为0则补0
    • 最高位为1则补1

大多数编译器对有符号数使用算术右移,对于无符号数,右移是逻辑右移


文章作者: kunpeng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 kunpeng !
  目录