先看一段有问题的代码并试着算出结果:
void foo(int i, long long *ll) {
printf("%ld\n", *ll);
}
int main() {
int i = 0;
int n = 1;
foo(n, &i);
return 0;
}
Q.请问在64位机器上结果是多少?
A.1 * 2^32
W.在64位机器上long long 占64 bit。函数调用的实参是int型 只占32 bit。解引用行参会取到64 bit,这时发生不够,就会向邻居非法借1 bit。所以结果是1 * 2 ^ 32。
|----------------------------64 bit ------------------------------|
|----------------------------long long----------------------------|
|-------------32 bit-------------|-------------32 bit-------------|
|-------------int----------------|-------------int----------------|
|-------------------------------1|00000000000000000000000000000000|