CSAPP随笔:信息的存储

 1.  可寻址的最小内存单位:字节。

 2. 虚拟内存:一个极其大的字节数组。

 3. 地址:用唯一的数字标识内存的每个字节。

 4. 虚拟地址空间: 所有可能地址的集合。

 5. c语言中指针的值都是某个存储块第一个字节的虚拟地址。编译器将每个指针和类型信息联系起来,根据指针类型生成不同的机器级别代码来访问存储在指针所指向位置的值,实际生成的机器代码不包含数据类型信息。

 6. 字:指明指针数据的标称大小,虚拟地址以字来进行编码的。决定虚拟空间的最大大小,位于 字长 w位的机器而言, 范围为 0~2w-1 。

 7.  int32_t 及int_64的数据大小都是固定的:分别为4字节及8字节。

 8. 除了char类型外,默认不加 unsigned 的都表示的有符号,char 默认为 unsigned char。

 9. 多字节的程序对象: 对象地址是?在内存中字节是如何排列的?

 10. 地址向索引值增大的方向增长,大端:数据的最高有效字节在地址的最高有效位处。 小端:数据的最低有效字节在地址的最高有效位处。 这里 是 有效字节, 所以会8位8位的比较,0x1234对应的小端存储为0x3412 大端为0x1234。

#####打印程序对象的字节表示#####
#include <iostream>
#include <stdio.h>

using namespace std;

typedef unsigned char *byte_pointer;

void show_bytes(byte_pointer start, size_t len)
{
    size_t i;
    for(int 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*));
}

void test_show_bytes(int val)
{
    int ival = val;
    float fval = (float)val;
    int *pval = &ival;
    show_int(ival);
    show_float(fval);
    show_pointer(pval);
}

int main()
{
    int val = 12345;
    test_show_bytes(val);
    return 0;
}

 显示发现:整型 浮点型的值与书中内容一致,指针的不同,是由于为8字节,同时,不同的机器/操作系统配置使用的存储分配规则是不同的。

 11. 计算机系统中右移分为两种情况,逻辑右移,算术右移,算术右移的高位补符号位,逻辑右移补0,一般情况下,有符号数使用的是算术右移,无符号为逻辑右移。

 12. 其中移位运算的优先级要低于加减,因此,1 << 2 + 1 并不等于5 而是8 ,需要(1 << 2)+ 1,加上括号。 

posted @ 2023-01-29 21:44  fourmii  阅读(16)  评论(0编辑  收藏  举报