返回信息流下面这个程序我打算让它输出33,但是输出16,请大家看看,哪里不对?
#include <stdio.h>
#include <stdint.h>
typedef uint8_t AAC_header[7];
uint16_t get_AACheader_length(AAC_header header){
uint16_t length ;
char flag[7]={ 0x00,0x00, 0x00, 0x03, 0xff, 0xe0, 0x00 };
uint32_t tmp ;
uint8_t i , j;
for(i = 0; i < 7 ;i ++){
flag[i] = flag[i] & header[i];
}
tmp = *((uint32_t *)(flag+3));
tmp = tmp >> 5;
char *t = (char *)&tmp ;
length = t[3] + t[2]*16;
return length ;
}
int main(){
AAC_header head = { 0xff,0xf1, 0x4c, 0x80, 0x04, 0x3f, 0xfc };
uint16_t len = get_AACheader_length(head);
printf("$$$$$$$$$$%u\n", len);
return ;
}
这是一条镜像帖。来源:北邮人论坛 / cpp / #47502同步于 2010/12/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
关于移位操作
blc
2010/12/9镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 rebirthatsix 的大作中提到: 】
: 应该是16,整型移位是little endian考虑了?
: --
: 珍惜眼前点滴
: ...................
高手帮忙解释下啊。在tmp=tmp>>5这步的调试信息如下,难道移位是在16位之中进行的?
(gdb) x/4bt &tmp
0x7fff31784acc: 00000000 00000100 00100000 00000000
(gdb) n
16 char *t = (char *)&tmp ;
(gdb) x/4bt &tmp
0x7fff31784acc: 00100000 00000000 00000001 00000000
你这是四字节四字节的看,建议你调试的时候按byte显示
int是4个字节,但是存储方式是little endian,int >>的时候,实际是在向低地址方向移动
tmp转化完,其在内存中的排列是0x20 0x00 0x01 0x00,跟你的结果是能对上的
按字节看,自己就能弄明白
【 在 rebirthatsix 的大作中提到: 】
: 指针+3位和+3个字节一样,这里flag是char *,+1就等于+1个字节
: --
再问一下,这是4个字节我存在int类型里进行移位,如果我想对5个字节移位,怎么办呢?
【 在 blc 的大作中提到: 】
: : 指针+3位和+3个字节一样,这里flag是char *,+1就等于+1个字节
: : --
: 再问一下,这是4个字节我存在int类型里进行移位,如果我想对5个字节移位,怎么办呢?
: ...................
只能4/8
用ULONG64 / longlong
因为移位操作转换到汇编里,源不是寄存器就是内存地址,只可能是32位或者64位
5字节只能放到8字节的低位里去移动
【 在 rebirthatsix 的大作中提到: 】
: : : 指针+3位和+3个字节一样,这里flag是char *,+1就等于+1个字节
: : : --
: : 再问一下,这是4个字节我存在int类型里进行移位,如果我想对5个字节移位,怎么办呢?
: ...................
哎,最后还是没用移位操作了。是不是可以这么说,多字节的移位操作在intel机器上不能取其每个字节进行操作啊(操作的话会比较难理解),因为intel的大地址存的是低位。
我调试的时候,tmp没有移位前,是00000000 00100000 00000100 00000000
移位后,是00000000 00000001 00000000 00100000
高8位的值为什么不对呢
这个定义的是uint,应该没有符号位的问题吧?
【 在 rebirthatsix 的大作中提到: 】
: 你这是四字节四字节的看,建议你调试的时候按byte显示
: int是4个字节,但是存储方式是little endian,int >>的时候,实际是在向低地址方向移动
: tmp转化完,其在内存中的排列是0x20 0x00 0x01 0x00,跟你的结果是能对上的
: ...................