经过努力,我无法解决以下问题。 2014年,印度工程专业毕业生能力测试(GATE)中提出了问题。
问题)对于访问X[i][j][k]
的C程序,编译器生成以下中间代码。假设整数的大小是32位,字符的大小是8位。
t0 = i * 1024
t1 = j * 32
t2 = k * 4
t3 = t1 + t0
t4 = t3 + t2
t5 = X[t4]
关于C程序源代码的以下哪一项陈述是正确的?
(a)X被声明为" int X[32][32][8]
"。
(b)X被声明为" int X[4][1024][32]
"。
(c)X被声明为" int X[4][32][8]
"。
(d)X被声明为" int X[32][16][2]
"。
为以前的论文提供解决方案的书之一说答案是选项(a)。怎么样?任何解释
提前致谢
答案 0 :(得分:2)
t1
是i * (inumInts * sizeof(int))
。
所以,inumInts
* 32 = 1024。
因此,inumInts
= 32。
t1
为j * (jnumInts * (inumInts/sizeof(int))
,因为j
的每一行都有1 i
。
所以,jnumInts
* 1 = 32。
因此,jnumInts
= 32。
t2
是k * (knumInts * (inumInts/sizeof(int) / ((inumInts*jnumInts)/sizeof(int))))
。
(因为每i
个i
行j
k
行
所以,knumInts
* 1/2 = 4。
因此,knumInts
= 8。
因此,int X[32][32][8]
。
答案 1 :(得分:2)
信息不足。我会试着向你证明:
为了让我们的生活更轻松,让我们将所有值除以4,因为它是整数的大小(考虑到8位的字符大小)。这让我们:
i的乘数:256; 乘数j:8; 乘数k:1。
k必须为1,因为它是最后使用的索引,这意味着它必须只跳转1个整数才能到达行中的下一个。
另一方面,j必须跳过8个整数,因此它可以到达下一行的相同位置。这意味着每行有8个整数。我们有k的价值。我们的数组X现在看起来像:X [i] [j] [8]
我必须跳过256个整数才能进入下一列。由于一行有8个整数,256/8 = 32,这意味着每列有32行,数组X为:X [i] [32] [8]
最后,我们需要知道数组有多少页面。但是没有办法知道这一点,因为我们需要以字节为单位的数组的完整大小,所以我们可以将它除以256,然后知道页数。这导致我们回到这个答案的开头:信息不足。
答案 2 :(得分:2)
Exp:给出int的大小为4B,char的大小为1B。内存是字节可寻址的。 让数组声明为类型X [A] [B] [C](其中Type = int / char和A,B,C是自然的 号)。
From t0 = i*1024, we conclude that B*C*(size of Type) = 1024.
From t1 = j*32, we conclude that C*(size of Type) = 32.
From t2 = k*4, we conclude that size of Type = 4.
Type = int, and
C = 8, and
B = 32.
答案 3 :(得分:1)
数组的第一个维度对地址计算没有影响。 sizeof(int)
确实会对地址计算产生影响。所以它可能有助于重写答案a)as
X[][32][8][4]
i j k
最后[4]
代表sizeof(int)
。所以地址计算是
(k * 4) + (j * 8 * 4) + (i * 32 * 8 * 4) = i * 1024 + j * 32 + k * 4
由此,我得出结论,a)和c)都是正确答案。