1

无法按预期工作,因为它没有正确设置 MSB 位。我正在使用 Metrowerks 编译器。

//shifting right 5 characters
char * buffer;
buffer=global_buffer;
for(i=0;i<5;i++) //shift right for 1;
{
    buffer[17-i]=(buffer[17-i]>>1)|(buffer[17-i-1]<<7);
}

编辑输入缓冲区(就在for循环之前)0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x2F,0xA0,0xC6,0x9D

我得到了for循环0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x17,0xD0,0xE3,0xCE

4

2 回答 2

9

你可能想要“unsigned char *buffer;” 这会将零移到最高位,而不是保留符号位。

于 2009-12-14T18:25:28.343 回答
2

“它没有正确设置 MSB 位”。

C标准说:

6.5.7/5 ... 如果 E1 具有带符号类型和负值,则结果值是实现定义的。

请参阅此草案,例如:http ://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf

大概char是在您的编译器上签名的,因此您应该检查您的编译器文档以查看 MSB 的正确值是什么。和所有其他位。

于 2009-12-14T18:56:42.413 回答