指针,课后作业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,如何解释,主要看定义。如果你看不到定义(你在逆向破解一个程序),那么为了判断值的类型,你必须观察程序中这个值的使用方式(如果使用整型算术指令,这个值就被解释为整数;如果使用浮点型指令,它就是浮点数)。
这个题没看懂,请问怎么计算出来的。 同问,帮顶 本帖最后由 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。
#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]