精华内容
下载资源
问答
  • 我们知道,内存的数据分为大端模式和小端模式,有时候我们把数据写进内存,我们可能不确定它是按照大端模式还是小端模式存的,除非我们写个小代码先验证一下(这里就不介绍怎么验证了),所以读出来可能就不是我们...

    我们知道,内存中的数据分为大端模式和小端模式,有时候我们把数据写进内存,我们可能不确定它是按照大端模式还是小端模式存的,除非我们写个小代码先验证一下(这里就不介绍怎么验证了),所以读出来可能就不是我们存进去的值了。这里介绍一种读写方式,是我在写代码过程中遇到的,本来是要用我自己的策略来存取的,但是被告知有这个宏,很开心拿来用了,按照这种方式,就可以解决我们的困扰了。在这里分享给大家。本人刚入行菜鸟,如果有不足的地方,请大神们指正


    大端模式写内存:

    #define write_int_big_endian_4b(_buf, _i_value) \

        do{\
            ((unsigned char*)(_buf))[0] = (unsigned char)(((_i_value) >> 24) & 0xff);\
            ((unsigned char*)(_buf))[1] = (unsigned char)(((_i_value) >> 16) & 0xff);\
            ((unsigned char*)(_buf))[2] = (unsigned char)(((_i_value) >> 8) & 0xff);\
            ((unsigned char*)(_buf))[3] = (unsigned char)((_i_value) & 0xff);\

        }while(0)


    大端模式读内存:

    #define read_int_big_endian_4b(_buf)   ((((unsigned)(((unsigned char*)(_buf))[0])) << 24) \
                                                | (((unsigned)(((unsigned char*)(_buf))[1])) << 16) \
                                                | (((unsigned)(((unsigned char*)(_buf))[2])) << 8)  \
                                                | (((unsigned)(((unsigned char*)(_buf))[3])) << 0))


    小端模式读内存:

    #define read_int_little_endian_4b(_buf)((((unsigned)(((unsigned char*)(_buf))[0])) << 0)  \
                                                | (((unsigned)(((unsigned char*)(_buf))[1])) << 8)  \
                                                | (((unsigned)(((unsigned char*)(_buf))[2])) << 16) \
                                                | (((unsigned)(((unsigned char*)(_buf))[3])) << 24))



    小端模式写内存:

    #define write_int_little_endian_4b(_buf, _i_value) \
        do{\
            ((unsigned char*)(_buf))[0] = (unsigned char)((_i_value) & 0xff);\
            ((unsigned char*)(_buf))[1] = (unsigned char)(((_i_value) >> 8) & 0xff);\
            ((unsigned char*)(_buf))[2] = (unsigned char)(((_i_value) >> 16) & 0xff);\
            ((unsigned char*)(_buf))[3] = (unsigned char)(((_i_value) >> 24) & 0xff);\
        }while(0)

    展开全文
  • 本文介绍了指针一个使用技巧,可以通过此方法将单片机中变量按字节保存到EEPROM中,也可以从EEPROM中还原一个多字节整型数或者浮点数。 在内存中变量对整数类型,包括 char, unsigned char, int, unsigned ...

    本文介绍了指针的一个使用技巧,可以通过此方法将单片机中的变量按字节保存到EEPROM中,也可以从EEPROM中还原一个多字节的整型数或者浮点数。

    在内存中变量对整数类型,包括
    char, unsigned char, int, unsigned int, long, unsigned long
    多于一个字节的按低字节在前,高字节在后的顺序存储的,比如
    int iv = 0x1234,则在内存中的存储顺序,从地址由低到高的顺序排列,其值分别为: 34 12
    long lv = 0x11223344则在内存中的顺序为: 44 33 22 11
    如果想修改一个整型数的某个字节,则可以运用指针直接进行操作如下所示:
    unsigned char *puc;
    int i;
    long lv = 0x11223344;
    unsigned char temp[4]={0,0,0,0};

    *puc = (unsigned char*)(&lv);
    for(i=0; i{
    temp = *(puc+i);
    }
    运行后temp中的值则为temp[]={0x44, 0x33,0x22,0x11};
    如果要修改一个数的值也可以直接用以上方法把赋值前后的操作数对调一下即可
    *(puc+i) = temp;
    即可通过*puc将temp中的单字节数转换为一个长整型数赋给 lv
    这种操作方法对数据的存储很有用,可以通过指针将长整型的数分别一个字节一个字节地写到文件中,读的时候按照同样的顺序再从文件中读到内存。当然在PC上也可以直接将长整型的数写到文件中,而在单片机中则只能一个字节一个字节地将数据写入到EEPROM中,通过这种指针操作就可以写到EEPROM中,或者读出整型或者浮点型数。以下为在ICCAVR中将数据写入到EEPROM和读出的程序。
    void EEPROMWriteLong( int addr, // address in EEPROM
    long dsrc) // source data
    {
    unsigned char *puc;

    puc = (unsigned char*)(&dsrc);
    EEPROMWriteBytes(addr, (void*)puc, sizeof(long));
    }

    long EEPROMReadLong( int addr)
    {
    long res;
    unsigned char *puc = (unsigned char*)(&res);
    EEPROMReadBytes(addr, (void*)puc, sizeof(long));
    return res;
    }

    指针真是一个好东东,用好了就像一把无坚不摧锐利无比的长矛,但是用不好了可是会扎自己哦,这就是C的精华之民在吧!

    展开全文
  • Java-小议计算机内存&字节内存:计算机内存是由一个有序的字节序列组成,用于存储程序及程序需要的数据。...因为可以任意顺序存取字节,所以内存也被称为随机访问存储器(Random-Access Memo...

    Java-小议计算机内存&字节

    内存:计算机内存是由一个有序的字节序列组成,用于存储程序及程序需要的数据。你可以将内存想象成计算机执行程序的工作区域。一个程序和它的数据在被CPU执行前必须移到计算机的内存中。每个字节都有一个唯一的地址,如图1所示:

    b48a04854c9d06cf1d2e414ff80b59de.png

    使用这个地址确定字节的位置,以便于存储和获取数据。因为可以按任意顺序存取字节,所以内存也被称为随机访问存储器(Random-Access Memory,RAM)。现在的个人计算机通常至少有4GB的RAM,但是它们一般装有6~8GB的内存。通常而言,一个计算机具有的RAM越多,它的运行速度越快,但是这条简单的经验法则是有限制的。

    内存中字节的内容永远非空,但是它的原始内容可能对于你的程序来说是毫无意义的。一旦新的信息被放入内存,该字节的当前内容就会丢失。同CPU一样,内存也是构建在一个表面上嵌有数百万晶体管的硅半导体芯片上。与CPU芯片相比,内存芯片更简单、更低速、也更便宜。计算机内存也是一种易失的数据保存形式:断电时存储在内存中的信息就会丢失。

    程序和数据被永久地存放在存储设备上,当计算机确实要使用它们时再移入内存,因为从内存读取比存储设备读取要快得多。字节(Byte /bait/ n. [C])是计算机信息技术用于计量存储容量的一种计量单位,也表示一些计算机编程语言中的数据类型和语言字符。一个字节等于8位二进制数,在UTF-8编码中,一个英文字符等于一个字节。

    数据存储是以“字节”(Byte)为单位,数据传输是以“位”(bit)为单位,一个位就代表一个0或1(即二进制),每8个位(bit)组成一个字节(Byte)。8bit=1Byte 注意1b不等于1B,数据存储是以10进制表示,数据传输是以2进制表示所以1Kb不等于1KB,1KB=1024B,1KB=1024Byte=1024*8bit。

    更多干货笔记关注微信公众号 : 老九学堂

    展开全文
  • 内存字节对齐

    2020-05-21 07:42:03
    计算机中内存空间都是按字节划分,从理论上讲对任何类型变量访问可以从任何地址开始,但是在程序实际编译过程中,编译器会对数据类型在编译过程中进行优化对齐,编译器会将各种类型数据按照一定规则在空间上...

    内存字节对齐

    1. 什么是内存字节对齐

    计算机中内存空间都是按字节划分的,从理论上讲对任何类型的变量的访问可以从任何地址开始,但是在程序实际编译过程中,编译器会对数据类型在编译过程中进行优化对齐,编译器会将各种类型数据按照一定的规则在空间上排列,而不是顺序的排放,这就是内存字节对齐。

    2. 为什么要内存字节对齐

    不同硬件平台对存储空间的处理是不同的。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如某些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐。其他平台可能没有这种情况,但是最常的情况是,如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数据,这样数据读取效率就会很差。

    3. 如何实现内存字节对齐

    3.1基本数据类型的自然边界对齐

    各种数据类型的自然边界对齐值如下:

    在这里插入图片描述

    3.2对齐的规则

    为结构体分配内存时,分配的内存大小至少是各个字段的长度和。通常,分配的结构体的长度会大于结构体各个字段的长度和,因为结构体需要对齐,即结构体各字段之间需要填充。

    缺省情况下,编译器为结构体的每个成员按其自然边界对齐方式分配空间,按照每个成员被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构体的地址相同。结构体整体的默认字节对齐值是结构体中的所有成员中对齐参数最大的一个的值,结构体长度的计算必须取所用过的所有对齐参数的整数倍

    结构体整体对齐方式取决于结构体中所有成员的自然边界对齐值的最大值和指定对齐值两者中最小的值。

    3.3如何指定对齐方式
    __attribute__ ((packed)); //取消结构在编译过程中的优化对齐。
    
    __attribute__ ((aligned (n))); //让所作用的结构体、类的成员对齐在n字节自然边界上,如果结构中有成员的长度大于n,则按照机器字长来对齐。n=1,2,4,8,16…
    
    

    GCC中荐使用这种方式实现字节对齐,关于#pragma pack不推荐使用,因此本文不作论述。

    这里强调下取消编译过程中的对齐优化:

    __attribute__ ((packed)); //取消结构在编译过程中的优化对齐。
    

    无论是Linux中的GCC,还是windows中的vc编译器,都是非紧凑模式的编译器,默认有字节对齐的优化。前面我们讲过不同平台关于字节对齐的处理可能是不同的,因此在涉及到跨平台通信时,不同的字节对齐方式,可能引起数据解读的问题。

    取消编译过程中的优化正是应用在这样的场合,它使得数据成员间紧凑排列,而不会去对齐优化。下面进行举例说明

    4.例子

    #include <stdio.h>
    struct tst1
    {
    	char  a;
    	short b;
    	
    	int   c;	
    };
    struct tst2
    {
    	char  a;
    	short b;
    	
    	int   c;	
    	
    }__attribute((aligned(4)));
    
    struct tst3
    {
    	char a;
    	short b;
    	
    	int  c;
    }__attribute((aligned(8)));
    
    struct tst4
    {
    	char a;
    	short b;
    	
    	int  c;
    	
    }__attribute((packed));
    struct tst5
    {
    	char a;
    	int  c;
    	
    	short b;
    };__attribute((aligned(4)));
    int main(void)
    {
    	printf("sizeof(struct tst1):%d\r\n", sizeof(struct tst1));
    	printf("sizeof(struct tst2):%d\r\n", sizeof(struct tst2));
    	printf("sizeof(struct tst3):%d\r\n", sizeof(struct tst3));
    	printf("sizeof(struct tst4):%d\r\n", sizeof(struct tst4));
    	printf("sizeof(struct tst5):%d\r\n", sizeof(struct tst5));
    	return 0;
    	
    }
    

    结果如下:

    [fiona@fiona test]$ gcc attribute.c -o attribute
    [fiona@fiona test]$ ./attribute 
    sizeof(struct tst1):8
    sizeof(struct tst2):8
    sizeof(struct tst3):8
    sizeof(struct tst4):7
    sizeof(struct tst5):12
    
    • 从tst1和tst2来看,此结构体的自然对齐是4字节,与成员中最大对齐int一致

    • 从tst2和tst3来看,印证前面的结论结构体整体对齐方式取决于结构体中所有成员的自然边界对齐值的最大值和指定对齐值两者中最小的值。

    • 从tst2和tst4来看,packed参数起了作用,取消了编译过程中的对齐,使结构体紧凑排列

    • 从tst2和tst来看,如果相邻成员放在一起能更接近但不大于对齐方式指定的字节位,编译器是会把它们放在一起看作整体,再作填充,以满足对齐方式,所以据此编排结构体成员可以节省一些空间

    5.参考

    https://blog.51cto.com/9291927/1790295

    展开全文
  • 内存计算机内存是由一个有序的字节序列组成,用于存储程序及程序需要的数据。...因为可以任意顺序存取字节,所以内存也被称为随机访问存储器(Random-Access Memory,RAM)。现在的个人计算机通常至少...
  • 内存 计算机内存是由一个有序...因为可以任意顺序存取字节,所以内存也被称为随机访问存储器(Random-Access Memory,RAM)。 现在个人计算机通常至少有4GBRAM,但是它们一般装有6~8GB的内存。通常...
  • 字(word)是一次存取,加工,传送的数据长度,字长是每个字所包含的位数,32位字长=4个字节 32(字长)/8(bit)=4(字节)因此1个字=4个字节 大端和小端是指数据在内存中的存储模式,它由 CPU 决定: 1)大端模式(Big-...
  • 计算机字节对齐的理解 在计算机体系中,CPU的对内存的读取是按照CPU位数进行的,如32位则按4字节进行存取,64位则按8字节进行存取。...如果没按字节对齐存储,则有的数据将会是以奇字节地址开始,此时CPU需要两个...
  • 为了速度和正确性,请对齐你的数据.  概述:对于所有直接操作内存的程序员来说,数据对齐都是... 然而,你的处理器并不是按字节块来存取内存的.它一般会以双字节,四字节,8字节,16字节甚至32字节为单位来存取内存.我们将上
  • 什么是内存 1.存储单元 用于存放数据的硬件,程序执行前先放到内存中才能被...指令的工作原理 内存有数据段和程序段,指令存放在程序段,变量存放在数据段 程序编译成指令,会告诉CPU应该去内存的哪个地址存取数据...
  • 内存对齐原因和规则

    2020-11-05 23:28:33
    尽管内存是以字节为单位,但是大部分处理器并不是按字节块来存取内存的.它一般会以双字节,四字节,8字节,16字节甚至32字节为单位来存取内存,我们将上述这些存取单位称为内存存取粒度. 现在考虑4字节存取粒度的处理器...
  • linuxc/c++内存对齐

    2021-04-19 21:47:08
    尽管内存是以字节为单位,但是大部分处理器并不是按字节块来存取内存的.它一般会以双字节,四字节,8字节,16字节甚至32字节为单位来存取内存。 现在考虑4字节存取粒度的处理器取int类型变量(32位系统),该处理器只能...
  • 摘要:上一篇(数据库(InnoDb)索引之底层数据结构实现)继上一篇文章中讲到了常见的查询算法以及相对应的数据结构,今天就来讲解一下为什么大多数的文件系统、数据库引擎采用B/B+ Tree作为索引结构。第一部分分析B/B+...
  • 存储字的位数与存储器中的数据线根数是相同的。 也就是说,存储器在取数据的时候,是一个存储字一个存储字取的。 即存储字是存储器存取数据的单位(最小大小)。 那么可寻址的最小内存空间什么意思呢? 我应该是一直...
  • C/C++内存对齐操作

    2021-04-14 22:07:22
    目录什么是内存对齐为什么要进行内存对齐如何进行内存对齐1.通过编译器来指定对齐长度2....尽管内存是以字节为单位,但是大部分处理器并不是按字节块来存取内存的.它一般会以双字节,四字节,8字节,16字节甚至3
  • 字节对齐

    2008-01-17 14:31:00
    现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始...一些平台对某些特定类型的数据只能从某些特定地址开始存取。其他平台可能没有这种情况,但是最常见的是如果 不
  • 为什么使用B+树而不是红黑树作为索引? 一般来说,索引本身也很大,不可能全部存储在...磁盘往往不是严格需读取,而是每次都会预读,即使只需要一个字节,磁盘也会从这个位置开始,顺序向后读取一定长度的数据放...
  • 建议 展开读取内存的循环 消除数据相关性 同时向存储控制器发送多个查询 请求不少于32个字节的增量式读取数据 使用所有经过请求的页面 对齐数据源地址 组合执行存取内存的代码 成组进行读写操作 仅仅在必要时才...
  • C/C++题目--内存对齐

    千次阅读 2019-06-13 18:47:11
    字节对齐(内存对齐)主要是根据编译器设定或者在特定系统环境下数据按一定规则存取内存位置。 为什么要对齐? 由于不同系统对数据存取的位置有着不同要求,对齐规则也就会有些不同。在X86系统下,一般...
  • NVM(非易失性内存)科普篇

    万次阅读 2017-06-27 14:13:03
    NVM特性NonVolatile Memory,非易失存储器,具有非易失、按字节存取、存储密度高、低能耗、读写性能接近DRAM,但读写速度不对称,读远快于写,寿命有限(需要像ssd一样考虑磨损均衡)。当电流关掉后,所存储的数据...
  • NonVolatile Memory,非易失存储器,具有非易失、按字节存取、存储密度高、低能耗、读写性能接近DRAM,但读写速度不对称,读远快于写,寿命有限(需要像ssd一样考虑磨损均衡)。当电流关掉后,所存储的数据不会消失的...
  • 在计算机中访问数据需要一个东西叫做 地址:内存每个字节都有一个编号。(区分:地址 &amp; 地址对应内容) 在内存中一般是通过变量名来对内存单元进行存取操作。但其实,程序编译后已经将变量名...
  • 2.7.9按字节、双字与四字进行内存处理 2.7.10数据对齐 2.7.11内存访问与计算组合 2.7.12读写操作组合 2.7.13只在必要时才访问内存 2.7.14内置C内存处理函数优化 2.7.15内存处理函数优化质量 2.7.16C字符串...
  • 2.7.9按字节、双字与四字进行内存处理 2.7.10数据对齐 2.7.11内存访问与计算组合 2.7.12读写操作组合 2.7.13只在必要时才访问内存 2.7.14内置C内存处理函数优化 2.7.15内存处理函数优化质量 2.7.16C字符串...
  • 2.7.9按字节、双字与四字进行内存处理 2.7.10数据对齐 2.7.11内存访问与计算组合 2.7.12读写操作组合 2.7.13只在必要时才访问内存 2.7.14内置C内存处理函数优化 2.7.15内存处理函数优化质量 2.7.16C字符串...
  • 大部分处理器并不是按字节块来存取内存的. 它一般会以双字节,四字节,8字节,16字节甚至32字节为单位来存取内存,我们将上述这些存取单位称为内存存取粒度, 如果没有内存对齐机制,数据可以任意存放,一个int变量存
  • SQL 回忆

    2010-06-13 09:29:00
    varchar 可变长度字符串,根据实际存取数据得到占用空间,汉字占两个内存空间,按字节存取 nvarchar 可变长度,按字符存取,汉字占一个内存空间。如果是汉字,比varchar放更多内容。 --当月天数select day...
  • 本软件采用高效的数据结构以及分析算法,从磁盘底层读出原始的扇区数据,将丢失或损坏的目录和文件在内存中进行快速精准重建。支持IDE/SCSI/SATA/SAS/USB等接口硬盘,RAID磁盘等存储介质,支持Ext2/Ext3/Ext4/...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 128
精华内容 51
关键字:

内存的数据按字节存取