大小端

本文通过一段C语言代码探讨了计算机内部如何存储数字以及puts函数的工作原理。代码利用类型转换和十六进制常量创建了一个字符串,并通过puts函数输出。文章解释了计算机内存中的大端和小端存储模式对数据顺序的影响,同时也介绍了如何通过类似代码检测系统的大端或小端特性。
摘要由CSDN通过智能技术生成

计算机数字的内部存储

多的不说,直接上代码

  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’就出啦的,但是这个为什么顺序是正好相反的呢?这么是因为我们计算机存储的时候有大端和小端的区别,就会出现这样的情况,小端存储的话,高位的字节会存储到高位的地址去.低位的字节会存储带低地址去.我们平时用的计算机大部分是小端存储,所以大部分的机器运行这一段的代码,结果都是这样的.这个方法也是一个很好的检验我们自己的计算机是大端存储还是小端存储的方法.
如果有不清楚或者是觉得我有哪里说的不好,说的不对的地方,欢迎大家反馈给我.也希望我能够给大家带来一点帮助.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值