menu Limu's Blog
CSAPP笔记(二)——信息的表示和处理
820 浏览 | 2021-01-03 | 阅读时间: 约 3 分钟 | 分类: 笔记 | 标签:
请注意,本文编写于 286 天前,最后修改于 196 天前,其中某些信息可能已经过时。

信息储存

我们都知道一个字节由8位bit组成,值域也就是00000000-11111111(二进制下),而通常计算机都使用16进制数来表示这个位模式,而C中我们通常都是认为0x或者是0X开头的数字常量作为16进制的值。
前面我们学习到,计算机都有一个字长用于指明指针数据的指标大小,因为虚拟地址是以一个字编码的,所以字长决定了一个虚拟地址空间的范围(0~2^字长-1)。我们常说的32位CPU就是32位字长的机器,就是410241024*1024的总大小,所以说这个也限制了可用的最大内存为4G,这也就是说32位的CPU就算加8G内存条也只能发挥出4G的运存。(向下兼容:64位CPU可运行32位程序,反之不可)。

小端序与大端序

某些机器选择在内存中按照从最低有效字节到最高有效字节的顺序存储对象,而另一些机器则按照从最高有效字节到最低有效字节的顺序存储。前一种规则——最低有效字节在最前面的方式,称为小端法(little endian)。后一种规则—-—最高有效字节在最前面的方式,称为大端法(big endian)。

大多数的intel兼容机都使用小端模式,有比较新的微处理器是双端法,但是一旦选择了操作系统,这个模式就会被固定下来,常见的IOS和Android就仅支持小端模式。
维基百科补充:




位级运算

注意&^|&&||的不同之处

移位运算

左移就只有对操作数的二进制位丢弃最高的k位,并且在右端补充k个0,但是,一般来说机器支持两整数表示种右移:逻辑右移,和算数右移,来看一个例子:

不幸的是,C语言并没有明确的定义对于有符号整数应该使用哪种类型的右移,这就出现了一个问题,但是在实际上,几乎所有的编译器/机器组合都对有符号数使用算术右移,另一方面,对于无符号数,则必须是逻辑右移。(java对于如何右移是有明确的定义)

注:当移动的位数大于w位组成的数据类型的时候,移位指令只考虑位移量的低log2w位,实际上位移量就是通过k(位移量) mod w得到的,这里有个例子:

操作符优先级

这块的确是个坑,我查了好多资料,做了下实验,我的gcc版本是10.2.0的,当前符合的就是这个:

整数表示

注:对于32位与64位的程序,long类型界限是不同的。

补码

#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_hex(short a, int len){
    int i;
    for(i = len*8 - 1; i >= 0; i--){
    if((1 << i) & a)
           printf("%c", '1');
       else
           printf("%c", '0');
}
}


main(){
    short x = 12345;
    short mx = -x;
    show_bytes((byte_pointer) &x ,sizeof(short));
    show_bytes((byte_pointer) &mx ,sizeof(short));
    show_hex(x ,sizeof(short));
    printf("\n");
    show_hex(mx ,sizeof(short));
}

通过这段代码能更好的了解下补码。

有符号数与无符号数的强制转换

注:位值不变,更改的只是解释的位的方式。在C中,要创建一个无符号常量,必须加上后缀字符'u'或者'u',例如:12345U或者Ox1A2Bu。

考虑将小数据和大数据的互相转换(扩充及截断)


拓展:函数getpeername的安全漏洞

整数运算

注:主要研究各种运算的原理周期

浮点数

注:将大浮点数转换成整数是常见的浮点溢出问题。

这一部分主要讲述了二进制下信息储存方式还有相关的运算,主要关注了溢出的原理和复现。这两天的进度太慢了(连续刷了好几天的奥特曼,废了),我爬。

文章转载请注明limu

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

全部评论

info 评论功能已经关闭了呐!