csapp 信息的表示和处理2.1.1-2.1.3

2.1 信息存储

  • 计算机在访问内存时并不直接访问单个的位,而是将8个位视为一个块,作为最小的可寻址的内存单位。
  • c编译器维护类型信息,机器级程序不包含类型信息。

2.1.1 十六进制(hex)表示法

  • 二进制过于冗长,二进制转十进制过于麻烦,故而使用十六进制。
  • 使用数字0-9和字母a-f来表示
  • C语言中十六进制数用0x开头表示
  • 当x为2的n次方时,要将x转化为16进制数
    将n表示为形如i+4j(0<=i<=3)的形式,则十六进制数最高位的数为1(i=0),2(i=1),4(i=2),8(i=3),后接j个0
    如217:17=1+4
    4,故i=1,j=4,得到的十六进制便是0x20000

2.1.2 字数据大小

  • 字长:决定虚拟地址空间大小
    字长为w,则该机器的虚拟地址为0~2w-1,程序最多访问2w个字节
  • 不同位程序的区别在于编译器的不同

2.1.3 寻址和字节顺序

  • 数据存入内存时遵循从右至左的顺序,而保存时分为大端法和小端法两种情况
    大端法:先保存的数据在高地址,后保存的数据在低地址
    小端法:先保存的数据在低地址,后保存的数据在高地址
  • 要考虑大小端法的三种情况:
    • 1.在不同端法的机器间传递信息时,要先将信息转换为网络标准进行传输
    • 2.在检查机器级程序时
    • 3.编写规避正常的类型系统的程序时。如下
#include <stdio.h>

typedef unsigned char *byte_pointer;

void show_bytes(byte_pointer start, size_t len)
{
    size_t i;
    for (size_t i = 0; i < len; i++)
    {
        printf("%.2x", start[i]);
    }
    printf("\n");
}

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

void show_float(float x)
{
    show_bytes((byte_pointer)&x, sizeof(float));
}

void show_pointer(void *x)
{
    show_bytes((byte_pointer)&x, sizeof(void *));
}
  • 整形数据和浮点型数据有不同的字节模式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值