微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

输出C中该程序的解释?

我在C中有这个程序:
int main(int argc,char *argv[])
{

  int i=300;
  char *ptr = &i;
  *++ptr=2;
  printf("%d",i);
  return 0;
}

小端上的输出为556.

我试着理解输出.这是我的解释.

问题是大端机器的答案是否仍然相同?

i = 300;
=> i = 100101100 //二进制,word格式=> B B Hb 0001 00101100其中B =字节,Hb =半字节

(A)=>在内存中(假设它是小端))

0x12345678 - 1100 - 0010 ( Is this correct for little endian)

0x12345679 - 0001 - 0000

0x1234567a - 0000 - 0000

0x1234567b - 0000 - 0000

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

相当于=> B B Hb 0010 00101100其中B =字节,Hb =半字节

我的推理是否正确?还有其他简短的方法吗?
RGDS,
多愁善感

解决方法

在小端32位系统中,int 300(0x012c)通常(*)存储为4个连续字节,最低位于第一个:2C 01 00 00.当您递增以前为int指针& i的char指针时,你指向该序列的第二个字节,并将其设置为2使得序列2C 02 00 00 – 当转回到int时,它是0x22c或556.

(至于你对比特序列的理解……看起来有点偏.Endianness影响存储器中的字节顺序,因为字节是最小的可寻址单元.字节内的位不会反转;低位字节将是2C(00101100)系统是小端还是大端.(即使系统确实反转了一个字节的位,它又会反转它们以将它们作为数字呈现给你,所以你不会’注意区别.)最大的区别在于该字节出现在序列中.位顺序重要的唯一位置是硬件和驱动程序,以及一次只能接收少于一个字节的位置.)

在大端系统中,int通常(*)由字节序列00 00 01 2C表示(仅与字节顺序的小端表示不同 – 最高字节首先出现).你仍在修改序列的第二个字节,但是……制作00 02 01 2C,其中int为0x02012c或131372.

(*)这里有很多东西发挥作用,包括两个补码(几乎所有系统都使用这些天……但C不需要它),sizeof(int)的值,对齐/填充,以及系统是否是真正的大端或小端或半实现它.这是为什么使用更大类型的字节进行混乱的一个重要原因,因此经常会导致未定义或特定于实现的行为.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐