【发布时间】:2015-07-26 21:22:48
【问题描述】:
这个问题适用于任何允许用户操作指针的编码语言,但我特别问的是 C++。
假设我们有两种大小相同的类型,例如,假设 (long) 和 (int) 的大小都是 8 字节。让我们声明一个 (long) 和一个 (int):
long someLong = 10;
int someInt = 20;
假设someLong和someInt的地址分别是X和Y,并假设十六进制,Y = X + 80。如果我尝试手动将X移动到Y然后取消引用它,我不会如我所料,得到 20 的值。这是为什么呢?
cout << &someLong + 10
cout << &someInt // these two return the same starting address location
cout << *(&someLong + 10) // dereferences an int as a long, but does not return 20!
【问题讨论】:
-
在为 x64 编译时,int 和 long 之间的差异在 0 到 4 个字节之间,具体取决于您使用的编译器。 GCC 使用的是 LP64 模型,也就是说 int 是 32 位,而 long 在 64 位模式下是 64 位。
-
@yanivx 即使指针大小相同,我也不确定这样的代码的可移植性如何。特别是,可能实现选择以不同的方式表示
someLong和someInt。 -
@vsoftco 实现根据架构选择大小
标签: c++ pointers types casting reference