数据在计算机中的储存问题--大端序和小端序

426 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

数据类型

在c++中,我们对于数据的类型一般有一下几种划分:

  • int
  • char
  • short
  • long long
  • double
  • float
  • 等 而这个数据类型,在计算机中存储的时候都有固定大小(int类型我们在这里仅看为32位)
  • int 32位 4个字节
  • char 8位 1个字节
  • short 16位 2个字节
  • long long 64位 8个字节
  • ... 那么我们想一下,这些数据类型在计算机中是怎么一个存储模式呢?字节存储顺序有是什么样的呢?我们以一个int类型的数,a=0x12345678,来作为例子,看一下,我们都知道,一般来说,存储单元应该是一个字节,所以对于int来说,应该是一个怎么样的存储模式呢? 假如我们以首地址1000h为例,那么a的存储样式是以下哪一个呢? 在这里插入图片描述 这两个样式都可以作为a的储存方式

大端序和小端序

字节存储顺序主要分为大端序(Big-endian)和小端序(Little-endian),区别如下

  • Big-endian:高位字节存入低地址,低位字节存入高地址
  • Little-endian:低位字节存入低地址,高位字节存入高地址

将12345678h写入1000h开始的内存中,以大端序和小端序模式存放结果如下 在这里插入图片描述 一般来说,x86系列CPU都是Little-endian字节序,PowerPC通常是Big-endian字节序。因为网络协议也都是采用Big-endian方式传输数据的,所以有时也把Big-endian方式称为网络字节序。 对于字符串来说,不论是以大端序的储存顺序还是以小端序的存储顺序结构都是一样的。

补充

举例

1001 + 1000 +0001 = ? 运算过程为: 第一步:1001+1000 = 10001 最高有进位(或者说“溢出”),将最高位移走,加到结果上。即: 第二步:(1)0001+1 = 0010 第三步:0010 + 0001 = 0011 得出结果:0011 求反码,得到UDP校验和。

十六进制来求

1001 + 1000 + 0001 = 9H + 8H + 1 = ? 第一步:9 + 8 = 11H 最高有进位(或者说“溢出”),将最高位移走,加到结果上。即: 第二步:1 + 1 = 2H 第三步:2 + 1 = 3H 得出结果:3H,0011