我在C中有这个程序:
int main(int argc, char *argv[])
{
int i=300;
char *ptr = &i;
*++ptr=2;
printf("%d",i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
小端上的输出为556.
我试着理解输出.这是我的解释.
问题是大端机器的答案是否仍然相同?
i = 300; => i = 100101100 //二进制,以word格式=> BB Hb 0001 00101100其中B = Byte和Hb =半字节
(A)=>在内存中(假设它是小端))
0x12345678 - 1100 - 0010 ( Is this correct for little endian)
0x12345679 - 0001 - 0000
0x1234567a - 0000 - 0000
0x1234567b - 0000 - 0000
Run Code Online (Sandbox Code Playgroud)
0x1234567c - 下一个intezer的位置(ptr ++或ptr + 1的位置,其中ptr是一个intezer指针,因为ptr的类型为int =>在执行++ ptr时它会增加4个字节(int的大小))
什么时候
(B)我们做char*ptr =&i; ptr将成为char =>类型,在执行++ ptr时它将增加1个字节(字符大小)所以在执行++ ptr时它会跳转到位置 - > 0x12345679(其中有0001 - 0000)现在我们正在做 + + ptr = 2 => 0x12345679将被2 => 0x12345679覆盖将有00*10** - 0000而不是000*1* - 0000
所以新的内存内容将如下所示:
(C)
0x12345678 - 1100 - 0010
0x12345679 - 0010 - 0000
0x1234567a - 0000 - 0000
0x1234567b - 0000 - 0000
Run Code Online (Sandbox Code Playgroud)
这相当于=> BB Hb 0010 00101100,其中B = Byte,Hb =半字节
我的推理是否正确?还有其他简短的方法吗?Rgds,Softy
在小端32位系统中,int 300(0x012c)通常(*)存储为4个连续字节,最低位为: 2C 01 00 00.当您递增以前为int指针的char指针时&i,您指向该序列的第二个字节,并将其设置为2会生成序列2C 02 00 00- 当转回到int时,该序列为0x22c556.
(至于你对比特序列的理解......看起来有点偏.Endianness影响存储器中的字节顺序,因为字节是最小的可寻址单元.字节内的位不会反转;低位字节将是2C(00101100)系统是小端还是大端.(即使系统确实反转了一个字节的位,它会再次反转它们以将它们作为数字呈现给你,所以你不会注意到差异.)最大的区别在于该字节出现在序列中.位顺序重要的唯一位置是硬件和驱动程序,以及一次只能接收少于一个字节的位置.)
在big-endian系统中,int通常(*)由字节序列00 00 01 2C表示(仅与字节顺序的小端表示不同 - 最高字节首先出现).你仍然在修改序列的第二个字节,尽管......制作00 02 01 2C,作为int是0x02012c131372.
(*)这里有很多东西可以发挥作用,包括两个补码(几乎所有系统都使用这些天......但C不需要它)sizeof(int),对齐/填充的价值,以及系统是否真的很大 -或者是小端或半实现的.这是为什么使用更大类型的字节进行混乱的一个重要原因,因此经常会导致未定义或特定于实现的行为.