1、概述

在计算机系统中,数据都是以字节进行存储的,每个地址单元对应一个字节,每个字节都是8位(bit)。但是C++除了char和bool之外,还有其它多字节类型。怎样存储多字节的数据就分为了大端和小端。字节序只和使用的处理器架构有关,和编程语言无关,常见的Intel系列是小端序。

2、大端和小端

大端模式(Big-endian):数据的高位字节保存在内存的低地址中,而数据的地位字节保存到内存的高地址中。这样的存储有点类似把数据当作字符串处理,和我们的阅读习惯一致。

小端模式(Little-endian):数据的高位字节保存在内存的高地址中,而数据的高字节保存到内存的低地址中。

看概念总是让人记不住或者难以理解,让我们看看例子:

假设一个类型为int的变量x,x的首地址为0x100即&x的值为0x100。那么x的4个字节被存储在存储器的0x100,0x101,0x102,0x103的位置。x 的值为16进制 0x12345678。

数据是0x12345678,数据的高位是12,低位是78。
内存地址低位是0x100,高位是0x103。
对照上面的表格就很明白了。现在虽然理解了,但是概念有点像绕口令,很难让人记住,有人就说了一种另外的方法来记。

Big-endian = 高尾端:数据的尾端存在存储器的高地址。
Little-endian = 低尾端:数据的尾端存在存储器的低地址。

3、怎么判断计算机的字节序

使用union的方法判断:

#include<stdio.h>
#include<stdlib.h>int  main(int argc, char **argv)
{union{short  s;char   c[sizeof(short)];} un;un.s = 0x0102;if (sizeof(short) == 2){if (un.c[0] == 1 && un.c[1] == 2)printf("大端法\n");else if (un.c[0] == 2 && un.c[1] == 1)printf("小端法\n");elseprintf("不能判断\n");} elseprintf("sizeof(short) = %d\n", sizeof(short));exit(0);
}

其它方法:

int main(int argc, char** argv)
{short int x;char x0, x1;x = 0x1122;x0 = ((char*)&x)[0];x1 = ((char*)&x)[1];printf("x0=0x%x", x0); return 1;
}

若是0x=0x11,则是大端(高尾端)。若是0x=0x22则是小端(低尾端)。

4、对程序员有啥影响?

大多数情况下对写程序不会出影响,但在某些特殊情况下会成为问题:
1、编写网络程序时,主机之间通过网络相互通信,不同主机之间可能采用不用的存储方法,而且网络字节序和主机字节序也有可能不同。当小端法机器产生的数据被发送到大端法机器或者反方向发送时会发现接受程序子里面的字节成了反序的。为了避免这种情况的发生,规定网络应用程序在将数据发送之前现将数据转换称网络字节序,在接收主机那边,主机再将网络字节序的数据转换成适合本主机的主机字节序,从而避免了字节序异常。(网络字节序为大端法)

注意:这里其实只对数据类型有效,对于传送字符串时,char占用一个字节,所以传输之后的顺序是不会变的。

网络编程中常用的转换函数有如下几个:

uing16_t htons(uint16_t host16bitvalue);    // 参数为16位主机字节序的值,返回值是16位网络字节序的值uint32_t htonl(uint32_t host32bitvalue);    // 参数为32位主机字节序的值,返回值是32位网络字节序的值uint16_t ntohs(uint16_t net16bitvalue);     // 参数为16位网络字节序的值,返回值是16位主机字节序的值uint32_t ntohl(uint32_t net32bitvalue);     // 参数为16位网络字节序的值,返回值是16位主机字节序的值

2、当调试程序时常常需要将程序编译成汇编形式,当阅读汇编代码时数据的字节序很重要,需要根据自己的机器是大端法还是小端法来不同对待,以免搞错字节顺序。

3、当编写规避正常类型系统的程序时,在C语言中可以使用强制类型转换来允许以一中类型引用一个对象,而这种数据类型与创建这个对象时定义的数据类型不同,大多数应用编程都不推荐这种编码技巧,但是它们对于系统级编程来说十分有用。

感谢大家,我是假装很努力的YoungYangD(小羊)。

参考资料:
https://www.cnblogs.com/broglie/p/5645200.html

大端和小端的含义及判断代码相关推荐

  1. 大端和小端的区别和判断

    1.概念 大端模式(big endian):数据的高位字节保存在内存的低地址中,而低位字节保存在内存的高地址中. 小端模式(little endian):数据的高位字节保存在内存的高地址中,而低位字节 ...

  2. 大端和小端的判断及转换

    当前的存储器,多以byte为访问的最小单元,当一个逻辑上的地址必须分割为物理上的若干单元时就存在了先放谁后放谁的问题,于是端(endian)的问题应运而生了,对于不同的存储方法,就有大端(big-en ...

  3. C语言基础 —大端和小端

    大端和小端 1.什么是大端和小端 2.为什么会有大端和小端 3.怎样判断是大端还是小端 1.什么是大端和小端 大端模式:就是 高位字节 存放在内存的 低地址端,低位字节 存放在内存的 高地址端 小端模 ...

  4. 大端和小端的区别,以及如何判断一台机器是大端还是小端?

    如何判断一台机器是大端还是小端 判断方式如下 判断方式如下 采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节,而Big-endian模式对操作数的存放方式是从高字节到低字 ...

  5. C语言中低位存放,C语言 大端小端存储解析以及判断方法

    当我们在C语言中查看数据在内存中的存储时,我们经常会发现一个很奇怪的现象,什么现象呢? 例如下面这段代码 int main() { int i = 1; return 0; } 数据在内存中的存放方式 ...

  6. C语言程序设计 | 大端小端存储解析以及判断方法

    当我们在C语言中查看数据在内存中的存储时,我们经常会发现一个很奇怪的现象,什么现象呢? 例如下面这段代码 int main() {int i = 1;return 0; } 数据在内存中的存放方式似乎 ...

  7. 判断单片机MCU是大端还是小端模式

    最近用杰理AC6966B调试博通的BK9527 U段发射芯片,一直没调通,经过测试IIC通讯是通,硬件还是好的,但是怎么都调不到与接收端成功连接. 最后咨询原厂得知提供的demo代码是大端编码模式的M ...

  8. 大端机与小端机介绍及其判断(C)

    为什么会有大小端模式之分呢? 这是因为在计算机中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8 bit.但是在C 语言中除了 8 bit 的char之外,还有 16 bit 的 ...

  9. 题目:如何判断一个机器是大端还是小端

    如何判断一个机器是大端还是小端 关于大端小端的概念, 小端:数据的高位字节存放在高地址内,数据的低位字节存放在低地址内. 大端:数据的高位字节存放在低地址内,数据的低位字节存放在高地址内. 典型的体系 ...

最新文章

  1. mysql 5.7笔记_关于MySql 5.7.29免安装版本的一个笔记
  2. mysql双主使用reset master清除日志要小心
  3. LaTeX 简介与安装
  4. 【Linux】24.gdb调试和coredump
  5. 《Node应用程序构建——使用MongoDB和Backbone》一第 1 章 介绍与总览1.1 打造一个社交网络...
  6. 32位PLSQL Developer无法登录Oracle 11g 64位
  7. Javascript特效代码大全(420个)
  8. vcenter服务器修改ip,vcSA修改IP或hostname
  9. php仿金蝶电商ERP进销存系统多仓库版
  10. php spider 参数详解,利用phpspider爬取网站数据
  11. win10卸载ie11后安装不上
  12. (译)在cocos2d里面如何使用物理引擎box2d:弹球
  13. SSM 博客系统开发实战
  14. UBOOT 字库相关
  15. php die 跳转,php里or die的常见用法
  16. 分布式服务框架Dubbo/Dubbox入门示例
  17. 会声会影2022试用版 智能、快速、简单的视频剪辑软件
  18. 基本功short与Unsigned short以及Java基本类型
  19. sparksql insertinto 源码解析
  20. PHP重要信息通知(短信通知+语音播报)解决方案

热门文章

  1. electron调用python_Electron中使用Node-ffi调用DLL
  2. Traefik入门指南
  3. emwin的模拟器配置
  4. python中retry的简单用法
  5. Spring Retry使用
  6. E - Gardener and Tree
  7. HT合泰单片机入门教程(第一章 HT单片机环境搭建)
  8. 计算机组成原理之CPU的功能和组成
  9. SpringBoot2.1.4整合log4j2保存日志到MySQL中
  10. php yii框架路由,yii框架如何配置路由