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,有符号类型数右移,高位补符号,这一点上是一样的
右移位个数没有限制,不会对右移个数进行取余
相关推荐
原创软件,MFC界面,可以任意转换64bit数据到2进制、10进制、16进制,2进制可以直接查看任意bit,取0~63之间的任意区间值,并且支持取位、移位大小端转换等等,尤其适合做嵌入式开发的相关人员使用。真正做到了简单...
原创软件,MFC界面,可以任意转换64bit数据到2进制、10进制、16进制,2进制可以直接查看任意bit,取0~63之间的任意区间值,并且支持取位、移位大小端转换等等,尤其适合做嵌入式开发的相关人员使用。真正做到了简单...
嵌入式开发必备小工具,能够对一个32位数字进行各种需要的转换操作(10进制、16进制、2进制转换;移位;修改任意位的值;大小端转换;取反)。
个人原创软件,MFC界面,可以任意转换64bit数据到2进制、10进制、16进制,支持取位、移位、大小端转换、加、减、乘、除、取余、与、或、非计算,支持Unicode、ANSI、UTF-8编码相互转换,支持MD5-32/MD5-16、CRC32/...
个人原创软件,MFC界面,可以任意转换64bit数据到2进制、10进制、16进制,支持取位、移位、大小端转换、加、减、乘、除、取余、与、或、非计算,支持Unicode、ANSI、UTF-8编码相互转换,支持MD5-32/MD5-16、CRC32/...
原创软件,MFC做的界面,可以任意转换64位的数据:2进制、10进制、16进制之间进行转换,取位、移位等等,包括大小端转换等等,简单、实用、方便,欢迎光临大家使用
个人原创软件,MFC界面,可以任意转换64bit数据到2进制、10进制、16进制,2进制可以直接查看任意bit,取0~63之间的任意区间值,并且支持取位、移位大小端转换、加、减、乘、除、取余、与、或、非等计算,支持GB2312Z...
原创软件,MFC界面,可以任意转换64bit数据到2进制、10进制、16进制,2进制可以直接查看任意bit,取0~63之间的任意区间值,并且支持取位、移位大小端转换、加、减、bit与、或、非等等,尤其适合做嵌入式开发的相关...
VL10 使用函数实现数据大小端转换 02 组合逻辑 VL11 4位数值比较器电路 VL12 4bit超前进位加法器电路 VL13 优先编码器电路① VL14 用优先编码器①实现键盘编码电路 VL15 优先编码器Ⅰ VL16 使用8线-3线优先编码器Ⅰ...
串行输出可配置为和标准移位寄存器或微处理器接口. ===TLC0832 的多路器可用软件配置为单端或差分输入.差分的模拟电压输入可以共模抑制和使模拟输入压偏移值为零.另外,输入基准电压可以调整大小,在全8位分辨率下...
原创软件,MFC界面,可以任意转换64bit数据到2进制、10进制、16进制,2进制可以直接查看任意bit,取0~63之间的任意区间值,并且支持取位、移位大小端转换、加、减、bit与、或、非等等,尤其适合做嵌入式开发的相关...
个人原创软件,MFC界面,可以任意转换64bit数据到2进制、10进制、16进制,支持取位、移位、大小端转换、加、减、乘、除、取余、与、或、非计算,支持Unicode、ANSI、UTF-8编码相互转换,支持MD5-32/MD5-16、CRC32/...
个人原创软件,MFC界面,可以任意转换64bit数据到2进制、10进制、16进制,支持取位、移位、大小端转换、加、减、乘、除、取余、与、或、非计算,支持Unicode、ANSI、UTF-8编码相互转换,支持MD5-32/MD5-16、CRC32/...
预习时对电机与拖动的试验方法及所测数据的大小作到心中有数。正式实验时,根据实验步骤逐次测取数据。 6、认真负责,实验有始有终 实验完毕,须将数据交指导教师审阅。经指导教师认可后,才允许拆线并把实验所用...
branch_prediction合成分支预测器C_bp_global_depth全局分支历史跟踪大小C_result_forwarding合成结果旁路C_load_aligner合成加载对齐器C_full_shifter pipelined而不是迭代移位器C_icache_size指令高速缓存大小(0...
为避免多次损坏LA7688A,可在印制板号为JU7.820.1534/1360的Y板上在R362左端与VD622正端之间背焊一只电容。在板号为:JU7.820.1535/1462的Y板上在V617"C"极与显象管座接地脚间背焊一只电容。该电容大小为:CT-500V...
3.11.1 数据组织与端格式 150 3.11.2 数据组织和ARM 152 3.11.3 块移动指令 156 3.12 整合——将所有内容放在一起 160 本章小结 163 习题 163 第4章 指令集体系结构——广度和深度 168 4.1 数据存储和栈 170 4.1.1 ...
74LS164是串人并出的8位移位寄存器,在⑧脚所加脉冲的上升沿作用下,把①、②脚(-般并联使用)输人的串行数据锁存在并行输出端,通过这些并行口线驱动数码管的各字段。数码管选用共阳的E10501-GP,当74LS164的输出...