我写了这个小代码来测试我的理解。但不明白背后的一些事实。我正在使用 64 位小端机器。所以任何指针都是 8 个字节。这意味着
#include<stdio.h>
int main(){
char *c = (char *)0x12345678889;
long a = 1;
int b = (long)(c-a);
/* int cc = (int)(c-a); gives compiler error */
printf("val = %x and b = %x", c-a,b);
return 0;
}
Output
val = 45678888 and b = 45678888
假设起始地址是 100。因此char*
100->89、101->88 ... 105->12 将存储在内存中,字节 106 和 107 将不使用。我的这个假设首先是正确的吗?由于 int 和 long 在 64 位机器中是 4 个字节,因此它将从 100,101,102 和 103 开始,并且只考虑这些字节。所以 45678889 - 1 = 45678888。我的理解正确吗?最后,当注释行给出编译器错误时,我不明白。编译器已隐式转换了上述行。但是为什么不在下面呢?