数据类型之间的类型转换

时间:2013-09-11 16:12:08

标签: c

我写了这个小代码来测试我的理解。但不明白其背后的一些事实。我正在使用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.我的理解是否正确? 最后,当注释行给出编译器错误时,我不明白。编译器隐含地对上述行进行了类型转换。但为什么不在下面?

1 个答案:

答案 0 :(得分:1)

首先,您不知道先验如何存储值,这取决于机器 endianess 。值可以从最低位到最高位存储,也可以相反存储。你的从低到高。

其次,在许多64位机器上,int长4个字节,长8个字节。会发生什么情况是您的计算机会计算c-a 0x12345678888(char *),然后将其转换为值long的{​​{1}},然后将其静默截断(longs在C中默默转换为int。)

注释会发出警告,因为0x12345678888的类型为c-a且无法以静默方式转换为char *(对于int来说,它被认为是非常危险的dans)。好的,你明确地转换了它,但编译器警告你它也是危险的。请注意,这些是警告而不是错误(可能取决于编译器选项......)。