从大端小端开始

首先附下百科的解释。

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

小端模式:数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。

概念上并不难理解,只是有时容易混淆。

个人的记忆方法是:将数据当做一个字符串顺序处理,从左往右看,如果每个字符(数据)对应的地址变大则为大端;反之则为小端。

为什么有大端小端:

电脑的内存单元是一个字节,而int、short等类型的大小不止一个字节。

于是int的4个字节在内存地址中是按照数据高字节对应高地址、低字节对应低地址(即高高低低)或高低低高分为了小端和大端。

测试本机为大端小端的方法:

网上看到的做法,多是用union来做的。

 1 #include <stdio.h>
 2 int main(int argc, char **argv)
 3 {
 4     union{
 5         int a;
 6         short b;
 7     }u;
 8     u.a = 0x12345678;
 9     printf("%x\n", u.b);
10     if(u.b == 0x1234)
11         printf("大端");
12     else if(u.b == 0x5678)
13         printf("小端");
14     else
15         printf("Error");
16     return 0;
17 }

这里也重温了C语言中的union这种数据类型。因为根本没用过,所以早已忘了。

这种类型最大的特点是所有成员共享同一块内存空间,编译程序保证分配给联合的内存能够容纳其最大的成员变量。

对其中一个成员赋值时,所有其他成员的值也会被覆盖。当然char类型只会覆盖int类型的部分值。

因此在这里给a赋值时,b的值也变了。而int和short的字节数不同,于是能看出大端小端。

时间: 2024-12-28 08:38:13

从大端小端开始的相关文章

大端小端是什么?如何区分?

    今天我们谈谈计算机中的大端小端以及网络中的大端小端.参考了网上好多资料以后,从众多资料中我也按照自己的理解方式,总结一下. 学习一个新东西:我们依然是先了解一下大端小端的历史: 讲故事 这个就需要求救一下度娘,以下故事来自度娘,真假我也不知道,权当听故事: "大端"和"小端"可以追溯到1726年的Jonathan Swift的<格列佛游记>,其中一篇讲到有两个国家因为吃鸡蛋究竟是先打破较大的一端还是先打破较小的一端而争执不休,甚至爆发了战争.19

大端小端

什么是大端小端 所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中: 所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中. 80c51,msp430,stm32 80c51是大端 msp4340采用小端模式读写存储器 如果是STM32F101xx和STM32F103xx仅支持小端模式,虽然Cortex-M3是大小都支持的.

大端小端的概念

对于一个由2个字节组成的16位整数,在内存中存储这两个字节有两种方法:一种是将低序字节存储在起始地址,这称为小端(little-endian)字节序:另一种方法是将高序字节存储在起始地址,这称为大端(big-endian)字节序.术语"小端"和"大端"表示多个字节值的哪一端(小端或大端)存储在该值的起始地址. #define  _CRT_SECURE_NO_WARNINGS 1 #include <stdlib.h> #include <stdio

大端小端的判断

大端小端的判断 1.联合体(共用体) union U { char s[9]; int n; double d; }; 联合体和结构体的定义和使用是一样的,就不详细的赘述.必须要记住:联合体所有的成员变量都是共享同一块内存的,从相同的起始地址进行赋值.也就是给联合体的一个成员变量赋值的时候,就会改变其他成员变量的值. 联合体的大小: 对于计算一个联合体的大小(共用体)来说,不同的编译器计算的结果是不同的. VS2013: union U { char s[9]; int n; double d;

【转】轻松记住大端小端的含义(附对大端和小端的解释)

原文网址:http://www.cnblogs.com/wuyuegb2312/archive/2013/06/08/3126510.html 或许你曾经仔细了解过什么是大端小端,也动手编写了测试手头上的机器上是大端还是小端的程序,甚至还编写了大端小端转换程序:但过了一段时间之后,当你再看到大端和小端这两个字眼,你的脑中很快浮起了自己曾经做过的工作,却总是想不起究竟哪种是大端.哪种是小端,然后又去查以前写的记录?更让人不快的是,这种经历反反复复,让你十分困扰.如果你和以前的笔者一样,有过这种不快

如何判断大端小端?

一.最简单的做法: 参考(深入理解计算机系统中文版第二版,P28,show_bytes) 转化成usigned char*的byte_pointer: 然后遍历输出每个字节的值,即可判断. 输入可以是任意一个数. 类似于:http://blog.csdn.net/yuucyf/article/details/7193148 二.利用联合 由于联合是共享地址的,所以可以采用如下方式: 1 #include <iostream> 2 using namespace std; 3 4 union 5

大端小端格式详解

1. 什么是大端,什么是小端: 所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中: 所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中. 2.为什么会有大小端: 为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit.但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处

栈增长方向与大端/小端问题

转:http://www.cnblogs.com/xkfz007/archive/2012/06/22/2558935.html 栈增长和大端/小端问题是和CPU相关的两个问题.在内存管理中,与栈对应是堆.对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向:对于栈来讲,它的生长方式是向下的,是向着内存地址减小的方向增长.在内存中,“堆”和“栈”共用全部的自由空间,只不过各自的起始地址和增长方向不同,它们之间并没有一个固定的界限,如果在运行时,“堆”和 “栈”增长到发生了相互覆盖时,称为“

大端小端(2)

请问下列代码的输出结果有可能是哪些()? #include<stdint.h> #include<stdio.h> union X{     int32_t a;     struct      {          int16_t b;         int16_t c;     }; }; int main() {      X x;     x.a=0x20150810;     printf("%x,%x\n",x.b,x.c);      retur