Juniorboy 发表于 2020-4-29 16:49:15

指针,课后作业21

4. 在内存中捕获到一组 32 位数据如下:
0110 0111 0110 1100 0110 1111 0110 0010
请问它的值可能是(多选,可借助计算工具):
A. 1 个 32 位整数:17351596500

B. 2 个 16 位整数:26476 和 28514
C. 4 个字符:glob

D. 浮点数:1.116533 * 10^24spe)
答:A、B、C 和 D 都正确!
呃……这辈子走得最长的路就是小甲鱼的套路……
出这道题呢,主要是为了让大家理解一点:不能简单地通过检查内存中的一个值来判断它的类型。其实它还可以被解释为机器指令!
内存中存放的值不是 0 就是 1,如何解释,主要看定义。如果你看不到定义(你在逆向破解一个程序),那么为了判断值的类型,你必须观察程序中这个值的使用方式(如果使用整型算术指令,这个值就被解释为整数;如果使用浮点型指令,它就是浮点数)。

这个题没看懂,请问怎么计算出来的。

Justin1 发表于 2020-4-30 21:33:32

同问,帮顶

THU_LSM 发表于 2020-4-30 22:10:55

本帖最后由 THU_LSM 于 2020-4-30 22:29 编辑

是不是这个意思:
如果存的是一个32位整数17351596500,那么在内存中的形式会是:0110 0111 0110 1100 0110 1111 0110 0010
如果存的是glob,因为在内存中g被记位0110 0111,l被记为0110 1100,o被记为0110 1111,b被记为0110 0010,所以glob这四个字符在内存里存一起就是0110 0111 0110 1100 0110 1111 0110 0010。
内存的二进制数据到底代表了现实生活中的什么实体含义,还得看程序里面的定义吧。不同类型的数据,可能会被编译器翻译成相同的机器代码(就是010101之类的)。反过来说,相同的二进制数据,可能映射到不同的类型的数据啦。
比如,在64位系统中:
int a=17351596500;

short b=26476, c=28514;

char d[]="glob" ;

float e=1.116533e24;

在编译器编译之后,a是0110 0111 0110 1100 0110 1111 0110 0010;
b和c连一起是0110 0111 0110 1100 0110 1111 0110 0010;
d(不算默认的最后的’\0‘)是0110 0111 0110 1100 0110 1111 0110 0010 ;
e也是0110 0111 0110 1100 0110 1111 0110 0010。

人造人 发表于 2020-4-30 23:31:46

#include <stdio.h>

int main(void) {
    int data = 0b01100111011011000110111101100010;
    printf("%d\n", data);
    printf("%hd %hd\n", ((short *)&data), ((short *)&data));
    printf("%c%c%c%c\n", ((char *)&data), ((char *)&data), ((char *)&data), ((char *)&data));
    printf("%e\n", *(float *)&data);
    return 0;
}


$ ./main.exe
1735159650
28514 26476
glob
1.116533e+24
$
页: [1]
查看完整版本: 指针,课后作业21