大端模式Big Endian和小端模式Little Endian以及浮点数在内存中的存储

小端浮点数内存中的存储 小端基础知识简述 及图解浮点数内存中的存储 阅读详情

大端模式和小端模式存放数据的区别很简单:大端模式先存放数据的高位字节,小端模式先存放数据的低位字节。

比如 int a=0x01234567,a所占的四个字节16进制标示:01 23 45 67。


在Linux系统中,使用命令:

```bash

lscpu

```

输出:

```bash

Architecture:          x86_64

CPU op-mode(s):        32-bit, 64-bit

Byte Order:            Little Endian

CPU(s):                8

On-line CPU(s) list:   0-7

Thread(s) per core:    1

Core(s) per socket:    1

CPU socket(s):         8

NUMA node(s):          1

Vendor ID:             GenuineIntel

CPU family:            6

Model:                 13

Stepping:              3

CPU MHz:               2499.998

BogoMIPS:              4999.99

Hypervisor vendor:     KVM

Virtualization type:   full

L1d cache:             32K

L1i cache:             32K

L2 cache:              256K

L3 cache:              15360K

NUMA node0 CPU(s):     0-7

```

注意其中`Byte Order:  Little Endian`。表示当前运行x86 Intel计算机使用的是`Little Endian`

写一个函数判断机器是不是大端模式:

bool isBigendian()
{
    int a=1;
    char *pa=(char *)&a;
    if((*pa)==0x01)
    {
        return false;
    }
    else
    {
        return true;
    }
}

网络传输中使用`Big Endian`

文件存储会不会受字节序影响呢?

如果是纯ASCII文件,那么大小端无所谓,因为每个字符只有一个字节。unicode文件,就要看保存文件的编码了,比如utf-8编码会在文件开头的两个字节里规定好使用什么字节序。

大小端字节序那个好呢?

大小端的概念来源于《格列夫游记》中的关于从大头敲开鸡蛋还是从小头敲开的斗争。就像小说里无意义的争斗一样,大小端字节序没有好坏之分。



浮点数在内存中怎么存储?

我们知道,浮点数分为单精度(float)和双精度(double)两种。float类型占4byte内存,double类型占8byte内存。浮点数的二进制存储标准遵循IEEE 754标准。下面定义一个浮点数,然后输出它每个字节内容。

void showbytes(unsigned char *p,int len) // 注意这个p指针类型必须是unsigned char,后边才能表示出真实的字节内容。要不然会进行符号位扩展。
{
    for(int i=0;i<len;i++)
    {
        printf("%x ",*(p++));
    }
    printf("\n");
}

int main()
{
    if(isBigending())
    {
        cout<<"this system is big endian"<<endl;
    }
    else
    {
        cout<<"this system is  little endian"<<endl;
    }

    float f=1.1;
    double d1=1.1;
    double d2=f;// f类型提升
    cout<<"f store as :"<<endl;
    showbytes((unsigned char *)&f,sizeof(f));
    cout<<"d1 store as :"<<endl;
    showbytes((unsigned char *)&d1,sizeof(d1));
    cout<<"d2 store as :"<<endl;
    showbytes((unsigned char *)&d2,sizeof(d2));

}

运行结果:



由于是小端模式,所以f存储到内存里后内存里内容为3f 8c cc cd 二进制:0011 1111 1000 1100 1100 1100 1100 1101

同理,d1在内存里的内容为3f f1 99 99 99 99 99 a9 二进制:0011 1111 1111 0001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1010 1001

同理,d2在内存中的内容为3f f1 99 99 a0 00 00 00二进制:0011 1111 1111 0001 1001 1001 1001 1001 1010 0000 0000 0000 0000 0000 0000 0000

IEEE754标准规定单精度浮点数:1位符号位,8位阶码,23位尾数。那么f的:

符号位:0

阶码:01111111,十进制阶码就是0

尾数:000 1100 1100 1100 1100 1101

转换成十进制约为1.1


IEEE754标准规定双精度浮点数:1位符号位,11位阶码,52位尾数。那么d1的:

符号位:0

阶码:011 1111 1111,十进制阶码就是0

尾数:0001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1010 1001

转换成十进制约为1.1


那么d2的:

符号位:0

阶码:011 1111 1111,十进制阶码就是0

尾数:0001 1001 1001 1001 1001 1010 0000 0000 0000 0000 0000 0000 0000

转换成十进制约为1.1


可以发现,d2的尾数就是f的尾数。f类型提升后低位填充0,所以精度并没有提高。

来点基础的东西,关于浮点数的大小端转换以及浮点数的格式解析 在网上并没有任何信息或则资料介绍关于浮点数的大小端转换问题,大小端是不同的内存存储实现方式,大端更符合人的阅读习惯,而小端则是更适合CPU读取。 我先说整型,整型数据在内存中就是符号数据两个部分,而且符号占一位,用32位整数举例,大端方式在内存中排列的顺序如下: 地址由小向大增加,而数据从高位往低位放 [0...7] [8...15] [16...23] [24...31] 0是标志位,1-31是数据。 我们用-999来说明,内存中存放的数据是:80 00 03 E7 而小端方式呢,ze. 阅读详情

相关推荐

存储器系统中的小端序(Little-endian)大端序(Big-endian)

摘要: 存储器系统采用两种字节序存储多字节数据:大端序(最高有效字节在低地址,如PowerPC)小端序(最低有效字节在低地址,如x86/ARM)。大端序符合人类书写习惯,小端序便于数学运算类型转换。网络通信统一使用大端序,不同架构设备交换数据时需转换字节序。程序员在网络编程、二进制文件处理底层调试时需注意字节序差异,通过htonl()等函数实现转换。两种字节序各有优劣,是计算机系统中对立共存的基础设计。

guigenyi的专栏 1067

大端模式小端模式的概念,区别以及优缺点

本文主要描述大端小端的概念,分类区别,还讲述了他们的由来,以及各自的优缺点,对初识者具有很大的帮助

Qt应用软件【数据篇】大小端数据转换

QtC++中如何大小端数据进行转换

小鱼酱的博客 1671

浮点数据类型在内存中的存储以及大小端介绍

但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存入内存时E的真 实值必须再加上一个中间数,对于8位的E,这个中间数是127;变量a是整型变量对应4个字节其十六进制表示为也就是20的十六进制为:0x00 00 00 14,我们看到14为低位(低字节),在放在地址Ox0021FA14中而剩下的00 00 003个字节依次存放在0x0021 FAl5,0×0021FA16,Ox0021 FA17中,这种低位在放在低地址,高位存放在高地址中就叫作小端存储模式。当s=1,V为负数。

Renswc的博客 2874

串口通信float型数据的处理发送;大端小端;联合体union占用字节大小;结构体的定义

在介绍float型数据的处理发送之前,先介绍一下大端小端以及联合体的大小分析。 一.什么是大端小端?如何测试你的CPU是大端还是小端? 1.大端小端小端:采用小端模式的CPU对操作数的存放方式是从低字节到高字节; 大端:采用大端模式的CPU对操作数的存放方式是从高字节到低字节。 高低字节:如0x12345678,其中78是低位,12是高位,就像十进制1234,4是个位,1是千位。 换个说法: 小端:数据低位放在了内存低地址,数据高位放在了内存高地址; 大端:数据低位放在了内存高地址,数据高位放在了

刘看山是山的博客 8064

大端模式/小端模式简介

理解并妥善处理大端模式小端模式的字节序问题,是开发跨平台、网络相关的软件系统不可或缺的一部分。通过合理的协议设计、利用现有工具库、以及编写健壮的字节序转换逻辑,开发者可以确保数据在不同环境间的一致性兼容性,从而提升软件系统的稳定性可扩展性。随着技术的发展,虽然现代框架库不断简化这一过程,但深入理解字节序的基本原理仍然是每位工程师的重要技能之一。

艾利克斯冰的博客 3327

计算机存储数据的顺序——小端Little-Endian)与大端Big-Endian

字节序(Endianness)指计算机在内存存储多字节数据(如整数、浮点数)时的字节顺序。当数据超过1字节(如16位、32位或64位数值)时,字节序决定了这些字节是如何排列的。大端模式Big-Endian):高位字节(Most Significant Byte, MSB)存储在低地址,低位字节(Least Significant Byte, LSB)存储在高地址。小端模式Little-Endian):低位字节(LSB)存储在低地址,高位字节(MSB)存储在高地址。大端Big-Endian

weixin_45805339的博客 1864

C/C++中的大端小端模式的说明、检测、转换与设置

C/C++中的大端小端模式的说明、检测、转换与设置

John_Tito的博客 7277

Big Endian & Little Endian大端&小端

Big Endian 字节序中,多字节数据的高位字节(MSB)存储内存的低地址端,低位字节(LSB)存储内存的高地址端。

qq_44718609的博客 647

数字的计算机表达--大小端浮点数

大端小端 起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:LilliputBlefuscu这两个强国在过去的36个月中一直在苦战。战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下令,命令所有的子民吃鸡蛋的时候,必须先打破鸡蛋较小的一端,违令者重罚。然后老百姓对此法令极为反感,期间发生了多次叛乱,其中一个皇帝因此送命,另一个丢了王位,产生叛乱的原因就是另

打酱油的葫芦娃 5771

内存探秘】数据在内存中到底长什么样?整数浮点数的惊人差异

摘要: 本文揭秘了数据在内存中的存储方式。整数采用二进制补码形式存储,正数原码=反码=补码,负数则通过反码+1转换为补码。浮点数遵循IEEE 754标准,按S(符号位)、E(指数)、M(尾数)三段式存储,类似科学计数法。此外还介绍了大小端字节序的区别及判断方法。理解这些底层存储机制,能帮助开发者更高效地调试程序,掌握计算机的"数字语言"。

liucbiY的博客 600

深入理解C语言:数据在内存中的存储(整数、大小端浮点数

本文深入浅出地讲解了C语言中数据在内存中的三种核心存储方式:整数存储(补码)、大小端字节序浮点数存储(IEEE 754)。通过原理解析详细的C语言代码示例,帮助读者直观理解补码的运算优势、字节序对多字节数据的影响以及浮点数的二进制构成。文章最后通过对比表格总结了三种方式的存储格式、优势、应用场景及常见陷阱,为底层编程跨平台开发提供扎实基础

skksiskwkwjsjs的博客 648

C语言--数据在内存中的存储

基本类型 unsigned char signed char 上面的为无符号类型,下面的为有符号类型,有什么区别呢? 得从整形在内存中的存储说起 原码、反码、补码 计算机中的有符号数有三种表示方法,即原码、反码补码。 三种表示方法均有符号位数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位三种表示方法各不相同。 原码 直接将二进制按照正负数的形式翻译成二进制就可以。 反码 将原码的符号位不变,其他位依次按位取反就可以得到了。 补码 反码+1就得到补码。 正数的原、反、补码都相同。 对于

starry1441的博客 353

单片机/C语言八股:(二)大端小端,包括区别与系统判断方法

大端小端,嵌入式开发面试常问知识点

qq_51409113的博客 742

计算机数据存储小端模式总结

在计算机科学中,大小端模式Endianness)是指存储器中多字节数据的字节顺序。具体来说,大小端模式影响的是多字节数据(如整数、浮点数)的字节存储顺序。总之,大小端模式是计算机中一个基础但重要的概念,直接影响多字节数据在内存外部存储中的存储方式解析方式。

专注音频,高效工作,快乐生活! 512

字节序,object类

Java整形的字节序是? 答:Big-Endian大端) 字节序是指多字节数据在计算机内存存储或网络传输时的各字节存储顺序。通常有Little-Endian(小端)Big-Endian大端)两种方式。以下将分别对这两种方式进行介绍。 (1)Little-Endian Little-Endian(小端)是指低位字节存放在内存的低地址端,高位字节存放在内存的高地址端。 例如,当按照小端模式存储时,十六进制数字表示 0x12 34 56 78在内存中的存储方式为: 低地址-----------

qq_49425839的博客 192

大端模式小端模式

Big-EndianLittle-Endian的定义如下: 1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。 2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。 举一个例子,比如数字0x12 34 56 78在内存中的表示形式为: 1)大端模式: 低地址 --------...

weixin_30586257的博客 95

数据在内存中的存储

摘要: 本文系统解析C语言中数据的内存存储机制,包括整数的补码表示、大小端字节序及浮点数的IEEE 754标准。整数以补码存储,解决原码/反码的运算缺陷;大小端模式影响多字节数据的存储顺序,可通过联合体或指针判断当前系统字节序;浮点数按符号位、指数位尾数位分层存储,特殊值(如±0、∞、NaN)有特定编码。文末提供代码验证整数浮点数的实际内存布局,帮助开发者理解底层数据表示及跨平台兼容性问题。

2402_86291429的博客 220
上一篇: 在linux中查找文件命令
下一篇: qmake的使用
bdss58
博客等级 码龄15年 220粉丝 243原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值