鱼C论坛

 找回密码
 立即注册
查看: 633|回复: 3

[已解决]指针,课后作业21

[复制链接]
发表于 2020-4-29 16:49:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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,如何解释,主要看定义。如果你看不到定义(你在逆向破解一个程序),那么为了判断值的类型,你必须观察程序中这个值的使用方式(如果使用整型算术指令,这个值就被解释为整数;如果使用浮点型指令,它就是浮点数)。

这个题没看懂,请问怎么计算出来的。
最佳答案
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。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-30 21:33:32 | 显示全部楼层
同问,帮顶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 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)[0], ((short *)&data)[1]);
    printf("%c%c%c%c\n", ((char *)&data)[3], ((char *)&data)[2], ((char *)&data)[1], ((char *)&data)[0]);
    printf("%e\n", *(float *)&data);
    return 0;
}
$ ./main.exe
1735159650
28514 26476
glob
1.116533e+24
$ 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-14 18:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表