【发布时间】:2019-04-05 09:00:15
【问题描述】:
我认为 C 中的整数首先存储最高有效位,例如,数字 5 将是 0...0101。我想我可以通过强制 C 来操纵特定位,让我假装特定的内存地址是 int 并添加到那里的位,就像它们是 int 一样。
我尝试在内存中设置 0 位 0,然后尝试将 255 添加到不同的内存地址,它似乎工作起来,因为当我添加 1 时,最低有效位存储在最高有效位之前的内存中到我的内存地址并更改了那里的位,我得到了一个更大的数字而不是一个较小的数字。如果最高有效位较早地存储在内存中,则将255 添加到内存地址高 1 个字节根本不会影响原始地址处的数字,因为最后 8 位是下一个int 的开头。我想知道我是否正确解释了这一点,并且 int 以最低有效位在前存储。
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
int main() {
int *x = malloc(8); //getting 4 memory addresses
int *y = malloc(8);
int *z = malloc(8);
int *a = malloc(8);
x[0] = 0; //setting 64 bits past memory addresses to 0s
x[1] = 0;
y[0] = 0;
y[1] = 0;
z[0] = 0;
z[1] = 0;
a[0] = 0;
a[1] = 0;
*((int*)((int)x)) = 255; //adding to x's memory address
*((int*)((int)y + 1)) = 255; //adding 1 byte over from y
*((int*)((int)z + 2)) = 255; //adding 2 bytes over from z
*((int*)((int)a + 3)) = 255; //adding 3 bytes over from a
printf("%d\n", sizeof(int));
printf("%d,%d\n", x[0], x[1]);
printf("%d,%d\n", y[0], y[1]);
printf("%d,%d\n", z[0], z[1]);
printf("%d,%d\n", a[0], a[1]);
printf("%d\n", x);
printf("%d\n", &x[1]);
return 0;
}
预期输出:
4
255,0
0,-16777216
0,16711680
0,65280
12784560
12784564
实际输出:
4
255,0
65280,0
16711680,0
-16777216,0
12784560
12784564
【问题讨论】:
-
您必须考虑到特定于平台的字节顺序,有关更多详细信息,请参阅以下链接stackoverflow.com/questions/12791864/…
-
我真的不明白你在这里想要完成什么。为什么所有的演员表?
-
@Max 这是否取决于编译器、机器或其他东西?
-
@LightnessRacesinOrbit 如果我没有先将内存地址转换为 int,+1 将被解释为 4 个字节而不是 1,但随后我不得不将其转换回 int* 并取消引用它是一个合适的左值,我可以将 255 分配给
-
问题是“伪装”违反了语言规则。至少在 C++ 中会这样;公平地说,我不是 100% 在 C 中的。