计算机数字的内部存储
多的不说,直接上代码
1 #include<stdio.h>
2 #include<stdlib.h>
3 int main()
4 {
5 puts((char*)(int const[]){
6 0X6F796958,0X6E694C75,0X72477875,
7 0X3270756F,0X313230,0X00000A
8 });
9 }
输出结果如下
XiyouLinuxGroup2021
原来这个题的问题是:请解释一下这行代码做了什么?
其实开始的时候我也有点蒙,第一次我觉得我是没有完全搞懂的,下面的也是我个人的一些见解,首先这个题目包含了两个强制类型的转换,{}里面的是一个数组,其实这个{}加上里面的数组就是一个地址,不过地址里面装的是这些数,这个跟字符串是一个原理。只不过是我们没有指针去记录这个数组的地址,但是我们也不需要来看一下man手册上面对于puts函数的函数原型:
#include <stdio.h>
int puts(const char *s);
关键的就是这个参数是const char *类型的,这个const其实没有那么重要,我测试了一下,吧代码中的char *改成const char *没有一点问题.
搞懂了这个我们就进一步来讨论括号里面的东西,0X00000A这个数对应的ascll码是换行字符。先从
0X313230这个数入手,转换成为二进制成了 1001100011110001110 ,但是在计算机的内部不是这么存储的,这个数只有22位我们必须要把他变成32位的 00000000 00110001 00110010 00110000 第一个对应的就是’\0’ 第二个是 1 第三个对应的是 2 第三个对应的是0,也就是说最后的一个0X00000A 是没有用处的.也就是说我们的021’\0’就出啦的,但是这个为什么顺序是正好相反的呢?这么是因为我们计算机存储的时候有大端和小端的区别,就会出现这样的情况,小端存储的话,高位的字节会存储到高位的地址去.低位的字节会存储带低地址去.我们平时用的计算机大部分是小端存储,所以大部分的机器运行这一段的代码,结果都是这样的.这个方法也是一个很好的检验我们自己的计算机是大端存储还是小端存储的方法.
如果有不清楚或者是觉得我有哪里说的不好,说的不对的地方,欢迎大家反馈给我.也希望我能够给大家带来一点帮助.