目录

一、什么是大小端

什么是大小端:

为什么会有大小端:

二、如何确定大小端

两种不同的求大小端的方式

常见的求大小端错误的方式:


一、什么是大小端

假如定义一个 int 类型的变量 a,让 a = 12345678(十六进制)

我们知道,数据在计算机中存储的单位是字节,1 Byte = 8 Bit = 2 个十六进制位。

而这四个字节在内存中与两种不同的存储方式

什么是大小端:

大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。

为什么会有大小端:

至于为什么要区分大小端,这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C语言中除了 8bit 的 char 之外,还有 16bit 的 shor t型,32 bit 的 long 型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于 大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以随时在程序中(在ARM Cortex 系列使用REV、REV16、REVSH指令)进行大小端的切换。

二、如何确定大小端

对于我们经常使用的x86架构的pc机来说,数据在内存中的存储方式为小端存储。

两种不同的求大小端的方式

//方法一#include <stdio.h>int check_sys()
{int i = 1;//转换为二进制补码:00 00 00 01//小端:01 00 00 00//大端:00 00 00 01return (*(char*)&i);//取出 i 的首字节数据//小端:01 -> 1//大端:00 -> 0
}int main()
{int ret = check_sys();if (ret == 1){printf("小端\n");}else{printf("大端\n");}return 0;
}
//方法二#include <stdio.h>int check_sys()
{union//共用体共用一段内存{int i;char c;}un;un.i = 1;//小端:10 00 00 00//大端:00 00 00 01return un.c;//小端:10 -> 1//大端:00 -> 0
}int main()
{int ret = check_sys();if (ret == 1){printf("小端\n");}else{printf("大端\n");}return 0;
}

常见的求大小端错误的方式:

//强制类型转换#include <stdio.h>int main()
{int a = 1;char b;b = (char)a;//a的补码:00 00 00 01  ->  1//强制类型转换时发生数据截断//此时 b 的补码:01  ->  1printf("b = %d\n", b);//无论大小端,结果都是1return 0;
}
//移位#include <stdio.h>
int main()
{int a, b;a = 1;//a 的补码:0000 0000 0000 0000 0000 0000 0000 0001  -> 1b = a >> 1;//移位后 b 的补码:0000 0000 0000 0000 0000 0000 0000 0000  -> 0printf("b = %d\n", b);//无论大小端,结果都是0return 0;
}
//位于#include <stdio.h>int main()
{int a = 1;//a 的补码:0000 0000 0000 0000 0000 0000 0000 0001int b = a & 0xff;//  0000 0000 0000 0000 0000 0000 0000 0001// &1111 1111 1111 1111 1111 1111 1111 1111// =0000 0000 0000 0000 0000 0000 0000 0001  -> 1//char b = a & 0xff  也是同理printf("b = %d\n", b);//无论大小端,结果都是1return 0;
}

总结:

对于取地址(指针)和联合体类型的操作都是基于内存层次的运算,这两种方法可以判断数据在内存上的存储方式。而对于强制类型转换和位于、移位的操作都是基于二进制补码层次的运算,这是高于内存层次的运算,也就是说将内存里面存放的数据拿出来再进行的运算,此时无法判断数据在内存中存储的方式。

C语言程序设计 | 大小端相关推荐

  1. C语言验证大小端的几个方法

    大小端的问题在很多面试笔试中都会遇到,最直接的考察是,笔试的时候,让你写一个代码,如何确定当前系统是大端还是小端的. 什么是大端和小端呢? 大端: 高位字节排放在内存的低地址端,低位字节排放在内存的高 ...

  2. C 语言编程 — 大小端区分

    目录 文章目录 目录 大端.小端 区分方式 1 区分方式 2 大端.小端 大端:高位字节放在内存的低地址端,低位字节放在内存的高地址端,CPU 对操作数的存放方式从高字节到低字节. 小端:低位字节放在 ...

  3. mysql 大小端_go语言中大小端模式的个人理解

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

  4. 【C语言】大小端字节序判断 常见笔试题型

    [前言]大家好,我是Catzzz666,一个一心让大家变强的博主.废话不说,让我们进入今天的正题. 大小端的引入: 我们先来看这样一段代码: 在内存中我们创建了局部变量a,那么a在内存中又是如何存储的 ...

  5. C语言实现大小端数据转换

    由于处理器不同以及数据存储方式的不同,造成了再不同平台下数据存在大小端存储的问题. 为了保持数据的一致性就要去数据在平台传输.转换过程中要保持相同的大小端数据格式. 常用的有16位.32位数据大小端数 ...

  6. 为什么很多人吐槽谭浩强的C语言程序设计,端碗吃饭放碗骂娘?

    这个观点在网络上已经论战了很长时间,出现这种情况还是历史遗留问题,谭浩强出的C语言教材几乎是国内的第一版,由于中英翻译问题或者对编程文化理解的差异性导致出来的书多多少少存在一些纰漏.不能只是记住其缺点 ...

  7. C语言查看大小端(纯代码)

    法一:直接在主函数中实现 int check() {int a = 1;char* p = (char*)&a;if (*p == 1){return 1;//小端}else{return 0 ...

  8. 大小端存储模式的理解和判断

    在计算机系统中,存储是以字节为单位的,每个地址单元都对应着一个字节,一个字节=8bit.在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器). ...

  9. c语言不允许对数组的大小做动态定义,数组,C语言程序设计课件,与中南大学出版社教材相配套.ppt...

    <数组,C语言程序设计课件,与中南大学出版社教材相配套.ppt>由会员分享,可在线阅读,更多相关<数组,C语言程序设计课件,与中南大学出版社教材相配套.ppt(32页珍藏版)> ...

最新文章

  1. 阿里都在用的绩效管理聚能环,一篇文章学会
  2. ffmpeg 和 SDL 教程2:输出到屏幕
  3. 安卓手机上最好的3个azw3阅读器
  4. OSPF —— 重分发(配置命令)
  5. w10系统服务器连接错误代码,Win10升级失败常见问题及错误代码解决方法汇总
  6. wordpress面包屑-wordpress面包屑设置方法
  7. android蓝牙耳机来电铃声,Android实现积极连接蓝牙耳机
  8. const T 与T const的比较(const T vs.T const的翻译 Dan Saks)
  9. 小鸡啄米之React组件内部的API
  10. python第一次作业
  11. 无情胜有情, 谁都不是谁谁谁的偶然
  12. 小程序开发框架介绍---remax 小程开发框架学习笔记
  13. 在手机上,可以把微信图片中的文字给识别出来吗?
  14. CentOS配置本地yum源/阿里云yum源/163yuan源
  15. 解读创客空间下的教育新生态
  16. mysql1214_mysql – #1214 – 使用的表类型不支持FULLTEXT索引
  17. 共享棋牌室/共享茶室,Java+小程序,sass,方案分享
  18. K8S系列(六)DaemonSet详解
  19. {} == {} 结果为什么是false?
  20. 向大家推荐《思考中医》,这本书对我来说算是中医启蒙了

热门文章

  1. 在HTML中实现两个div并排显示
  2. 2021年西式面点师(初级)考试题库及西式面点师(初级)考试试题
  3. LCD和OLED显示屏有什么区别?
  4. java基本数据类型Char
  5. 三个团队的站立会议旁观笔记
  6. 软件测试人员常用的SQL语句
  7. 微信公众号发送汉字乱码
  8. java list 索引值_List中固定某个索引的值-简单替换位置
  9. 云开发(微信-小程序)笔记(十四)---- 收藏,点赞(上)
  10. 陈景润定理对筛法理论的重要贡献