一个有趣的问题

编译运行会发生什么?

哈哈,当然是给出warning后Segmentation fault。

。。。。。。用指针解决一下

我们都知道:数据在内存中是01存储的,它是什么类型的数据,就看我们怎么看待它。

(4407873)10进制 -> (434241)16进制

我们知道:16 进制的41、42、43对应10进制assci码中大写字母A    42->B,43->C

但是,为什么输出是ABC而不是CBA?

这就涉及到计算机中大小端问题了。下面这个是百度百科的解释:

大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。

小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。

下面是一个前辈关于大小端的文章:

https://blog.csdn.net/u011327334/article/details/46555047

由此我们可知:我们的int a在内存中是   41 42 43 这样存的。

画个图:

所以我们输出的是:ABC(灵魂画师……哈哈哈)

--------------------------------这是分界线--------------------------------

下面我们想办法改一下

如何让其输出:A3C ?(就是把B改成3)

哈哈哈,其实方法很多。

1.计算出A3C的值,在调试的时候改内存中的值。

2.用union

 struct MyColor

{

 int color;

 char c[4];

};

 int main()

{

 union MyColor mycolor;

 mycolor.color = 4407873;

 printf("%s\n",mycolor.c);

输出ABC

 mycolor.c[1] = '3';

 printf("%s\n",mycolor.c);

输出A5C

}

这样输出的就是 A3C。

等等等等,还有很多。

还请前辈学长学姐同学们批评指正!

猜你喜欢

转载自blog.csdn.net/Hanoi_ahoj/article/details/80793937