`

大小端与移位

    博客分类:
  • c
c 
阅读更多

1.大端模式:数据的低字节保存在内存的高地址中
   小端模式:数据的低字节保存在内存的低地址中


3.比较

小端模式:强制转换数据类型不需要调整字节内容
大端模式:符号位的判定固定为第一个字节的最高位,容易判断正负。

4.

常用的X86架构cpu是小端模式,

 


而KEIL C51单片机为大端模式。
很多的ARM,DSP都为小端模式.
ARMv7架构的cm3默认是小端模式(但可配置)

5.java由于虚拟机的关系,屏蔽了大小端问题,需要知道的话可用ByteOrder.nativeOrder()查询

c判断大小端的2种方法
方法一:
void isBigEndian()
{
   short a = 0x1122; //十六进制,一个数值占4位
   char b = *(char *)&a; //通过将short(2字节)强制类型转换成char单字节,b指向a的起始字节(低字节)
   if( b == 0x11) //低字节存的是数据的高字节数据
   {
     printf("是大端模式");
   }
   else
   {
       printf("是小端模式"); 
   }
}


方法二:
//原理:联合体union的存放顺序是所有成员都从低地址开始存放,而且所有成员共享存储空间
void isBigEndian()
{
   union temp
   {
      short a;
      char b;
   }temp;

   temp.a = 0x1234;

   if( temp.b == 0x12 )//低字节存的是数据的高字节数据
   {
      printf("是大端模式");
   }
   else
   {
      printf("是小端模式"); 
   }
}
============================================================
如果代码这样写
short a
char b
b = (char)a;
b的值和大小端是没有关系的
因为向下的类型转换时,保留的是a值的低字节部分,而不是内存中数据的低地址字节部分
对于小端模式 :向下强制转换数据时,计算机不需要调整内存中的数据内容,保留a的低字节就行了
对于大端模式:向下转换后,a的低字节被保留,并且该被保留的低字节数据在内存中还要被放到合适的位置

如果是
a=b ; 这是自动向上的类型转换,向上不需要强转,数据高字节自动补0


关于移位
在x86平台, vc6中 ,  有  a=i<<n

若i是一个变量,则

移位数是n%=32,
若移位n=33, 就是移1位
若移位n=32, 就是移0位
也就是取n的低5位作为有效移位值

 

若i是立即数, n不会执行 n%=32

例如a=(1<<33)   , a=0

 

 



在keil4中的c51,左移位数最多是15位,大于15就结果为0
u16 a =1;
a|=(1<<15)         a=0x8001
a|=(1<<16)         a=0x0001 即 1<<(16+x)结果为0 ,也就是说移位超过15就结果是0

u32 a=1;
a|=(1<<14)         a=0x00004001 这个也正常
a|=(1<<16)         这个结果是1 因为1<<16=0

a|=(1<<15)         a=0xffff8001
当左移后,第15位为1时,就会出现这种情况,a的高16位都是1

在mdk中没有这种情况,而且移位也没有vc中取余的情况,移位数大于31时结果为0


============================================================
再来看一下vc6中的右移
c代码1
unsigned long a = 0x80000000;
a>>=33;

反汇编代码
10: unsigned long a = 0x80000000;
004010B8 mov dword ptr [ebp-4],80000000h
11: a>>=33;
004010C6 mov eax,dword ptr [ebp-4]
004010C9 sar eax,21h //无符号右移,也称逻辑右移,同java中的>>>
004010CC mov dword ptr [ebp-4],eax
a = 0x40000000 ,即0x80000000 sar 1


c代码2
long a = -2147483648; //32位long的最小值
a>>=33;

反汇编代码
11: long a = -2147483648;
004010B8 mov dword ptr [ebp-4],80000000h
12: a>>=33;
004010C6 mov eax,dword ptr [ebp-4]
004010C9 shr eax,21h //有符号移位,也称算术右移,同java中的>>
004010CC mov dword ptr [ebp-4],eax
a=-1073741824 ,或者说a=0xc0000000,即0x80000000 shr 1
结果表明
无符号类型数右移,高位补0,用的是sar指令
有符号类型数右移,高位补符号,用的是shr指令
移位数也是低5位有效,a=33时,相当于右移1位

在keil4中
无符号类型数右移,高位补0,有符号类型数右移,高位补符号,这一点上是一样的
右移位个数没有限制,不会对右移个数进行取余

0
1
分享到:
评论

相关推荐

    二进制,十进制,十六进制,bit转换工具 v1.5.1【最终版】

    原创软件,MFC界面,可以任意转换64bit数据到2进制、10进制、16进制,2进制可以直接查看任意bit,取0~63之间的任意区间值,并且支持取位、移位大小端转换等等,尤其适合做嵌入式开发的相关人员使用。真正做到了简单...

    二进制、十进制、十六进制转换工具 V1.5【终极版】

    V1.5【终极版】”是一个基于MFC(Microsoft Foundation Classes)界面库开发的实用程序,它提供了便捷的转换功能,能够帮助用户轻松地在这些数制之间进行转换,同时包含了取位、移位以及大小端转换等多种操作。...

    二进制,十进制,十六进制,bit转换工具【Ucode++ v1.8.1】

    个人原创软件,MFC界面,可以任意转换64bit数据到2进制、10进制、16进制,支持取位、移位、大小端转换、加、减、乘、除、取余、与、或、非计算,支持Unicode、ANSI、UTF-8编码相互转换,支持MD5-32/MD5-16、CRC32/...

    前后端AES加解密信息交互示例(后端JAVA)

    本示例"前后端AES加解密信息交互示例(后端JAVA)"提供了一个详细的教程,演示了如何利用AES加密技术来确保在前端与后端之间传递的数据安全无虞。AES,即高级加密标准(Advanced Encryption Standard),是一种广泛...

    进制转换,二进制,十进制,十六进制,bit转换工具

    原创软件,MFC界面,可以任意转换64bit数据到2进制、10进制、16进制,2进制可以直接查看任意bit,取0~63之间的任意区间值,并且支持取位、移位大小端转换等等,尤其适合做嵌入式开发的相关人员使用。真正做到了简单...

    对称加密AES算法,前后端实现

    3. 行移位:将矩阵中的行向左循环移动特定位数。 4. 列混淆:通过一个线性变换对矩阵的列进行混合。 5. 轮密钥加:将当前轮的轮密钥与状态矩阵逐位异或。 **前后端实现** 在实际应用中,通常需要在前端和后端之间...

    二进制,十进制,十六进制,bit转换工具【Ucode++ v1.8.3.3】

    个人原创软件,MFC界面,可以任意转换64bit数据到2进制、10进制、16进制,支持取位、移位、大小端转换、加、减、乘、除、取余、与、或、非计算,支持Unicode、ANSI、UTF-8编码相互转换,支持MD5-32/MD5-16、CRC32/...

    嵌入式开发必备小工具BitEasy

    嵌入式开发必备小工具,能够对一个32位数字进行各种需要的转换操作(10进制、16进制、2进制转换;移位;修改任意位的值;大小端转换;取反)。

    二进制,十进制,十六进制,bit转换工具【Ucode++ v1.8.3.1】

    个人原创软件,MFC界面,可以任意转换64bit数据到2进制、10进制、16进制,支持取位、移位、大小端转换、加、减、乘、除、取余、与、或、非计算,支持Unicode、ANSI、UTF-8编码相互转换,支持MD5-32/MD5-16、CRC32/...

    开发板芯片74HC595中文资料.pdf

    该芯片集成了8位移位寄存器与8位锁存器,能够支持串行数据输入和并行数据输出。此外,74HC595还具备了高阻关断状态和三态输出功能,使其在各种应用环境中都能表现出色。 #### 主要特性 - **8位串行输入**:支持串行...

    二进制,十进制,十六进制,bit转换工具【Ucode++ v1.8.0】

    个人原创软件,MFC界面,可以任意转换64bit数据到2进制、10进制、16进制,2进制可以直接查看任意bit,取0~63之间的任意区间值,并且支持取位、移位大小端转换、加、减、乘、除、取余、与、或、非等计算,支持GB2312Z...

    串口通讯传输速率与传输距离

    ### 串口通讯传输速率与传输距离 #### 波特率与串行通信中的数据传输速率 在串行通信领域,波特率是一个至关重要的概念,它用来衡量数据传输的速度。波特率具体指的是每秒钟能够传输的二进制位数,单位通常用bps...

    常用集成电路名称功能一览表1

    - **CD4085**:双2路2输入端与或非门,结合了与、或、非三种逻辑。 - **CD4086**:四2输入端可扩展与或非门,提供灵活的逻辑组合。 - **CD4089**:二进制比例乘法器,用于信号的数学运算。 - **CD4093**:四2输入端...

    用块RAM实现卷积交织解交织

    本文详细介绍了一种利用块RAM(Block RAM)替代传统FIFO移位寄存器来实现卷积交织与解交织的技术方案。该方法不仅简化了设计流程,还有效减少了FPGA或ASIC实现过程中的资源消耗。 #### 卷积交织解交织原理 卷积...

    二进制,十进制,十六进制,bit转换工具【v1.6】

    原创软件,MFC界面,可以任意转换64bit数据到2进制、10进制、16进制,2进制可以直接查看任意bit,取0~63之间的任意区间值,并且支持取位、移位大小端转换、加、减、bit与、或、非等等,尤其适合做嵌入式开发的相关...

    74ls系列芯片功能列表

    用于比较两个4位数字的大小。 #### 十二、其他 - **74LS86**: 2输入四异或门。四个2输入异或门。 - **74LS87**: 四位二进制原码/反码/补码单元。四位二进制数的原码、反码和补码转换单元。 - **74LS89**: 64位读/...

    带数字显示的八档音量控制器.doc

    两个 74LS194 芯片的 8 个输出端接一个 8 线-3 线优先编码器 74HC148 芯片,74HC148 芯片的输出端分别接 BCD 码七段译码驱动器的输入端,通过 BCD 码显示译码器显示音量的大小档位。 在设计中,我们还需要考虑到...

    数字电子技术期末试卷【附答案】.doc

    7. 移位寄存器的移位方式:移位寄存器的移位方式有循环移位、左移位和右移位。 8. 同步 RS 触发器:同步 RS 触发器中,R、S 为高电平有效,基本 RS 触发器中 R、S 为低电平有效。 9. 脉冲产生电路:常见的脉冲产生...

    verilog+牛客网刷题自己编写代码汇总+时序分析+状态机等+刷题学习_rezip1.zip

    VL10 使用函数实现数据大小端转换 02 组合逻辑 VL11 4位数值比较器电路 VL12 4bit超前进位加法器电路 VL13 优先编码器电路① VL14 用优先编码器①实现键盘编码电路 VL15 优先编码器Ⅰ VL16 使用8线-3线优先编码器Ⅰ...

    verilog+牛客网刷题自己编写代码汇总+时序分析+状态机等+刷题学习_rezip.zip

    VL10 使用函数实现数据大小端转换 02 组合逻辑 VL11 4位数值比较器电路 VL12 4bit超前进位加法器电路 VL13 优先编码器电路① VL14 用优先编码器①实现键盘编码电路 VL15 优先编码器Ⅰ VL16 使用8线-3线优先编码器Ⅰ...

Global site tag (gtag.js) - Google Analytics