搜索
bottom↓
回复: 1

请教马老师关于大小端

[复制链接]

出0入0汤圆

发表于 2010-3-27 13:40:54 | 显示全部楼层 |阅读模式
马老师好,各位好!
   1、 请问单片机有没有大小端之分?
    struct b {  
            char b0:1;  
            char b1:1;  
            char b2:1;  
            char b3:1;  
            char b4:1;  
            char b5:1;  
            char b6:1;  
            char b7:1;  
            } bit;  
   3、   bit.b0到底是指0x80还是0x01?
   4、   C编译器都支持这种写法吗?
   5、我这种判断大小端的方法是否正确
static union {
        char c[2];
        unsigned long l;
           } endian_test = {{'l','b'}};
#define ENDIANNESS ((char)endian_test.l)
谢谢!

出0入0汤圆

发表于 2010-4-7 22:32:45 | 显示全部楼层
首先你的概念是模糊的,不清楚大小端是在什么情况下而产生的问题。

作为一个以字节为单位的数据,比如char byte类型的,放在以字节为单位寻址的储存器中,是没有什么“大小端”问题的。b0总是一个字节的第0位,b7总是一个字节的最高位。

而以字或双字为单位的数据,比如int\long int类型的,放在以字节为单位寻址的储存器中,则才有“大小端”问题。比如一个16位int型数据需要占用连续2个字节的内存中(假如地址是0x000和0x001),那么需要知道低8位数据是放在0x000中,还是在0x001中。但不管怎样情况,16位数据的第0位和第8位,总是对应单个内存字节的最低位。16位数据的第7位和第15位,总是对应单个内存字节的最高位。

如果CPU是16位的,而内存是以字节为基本单位,那么在硬件上就会确定该处理器或控制器是采用“大”还是“小”端模式,那么相应的编译器必定采用与硬件相同的模式。

如果CPU本身是8位的,内存是以字节为基本单位,没有16位的操作或寄存器,那么采用“大小端”就取决于编译器了,需要看所使用的编译器。

对于AVR来说,尽管它的CPU本身是8位的,内存也是以字节为基本单位,但AVR内部有16位的寄存器。比如16位的Z寄存器,它分别为32个8位寄存器的R30、R31,并且硬件规定了R30是Z的低8位,R31是Z的高8位。这也就从硬件上规定了低位在前的方式,因此所有的编译器就都会采用这个方式的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 08:05

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表