※ 引述《mecs (mecs)》之銘言:
: 標題: Re: [問題] 關於big endian轉little endian的問題
: 時間: Fri Nov 13 11:26:01 2009
:
: ※ 引述《arluba (...)》之銘言:
: : 我想請問一個 signed short (16bit) big endian 轉 little endian的問題
: : 我想知道在做signed short 轉換時
: : 跟unsigned short比較起來 有什麼不一樣或是需要注意的地方嗎?
: : 以下附上unsigned short endian轉換的方式~
: : 假設i是unsigned short的data
: : i = ((i>>8)&0xff)+((i << 8)&0xff00);
: : 現在的問題是如果i是signed short,那轉換上會有什麼不一樣嗎?
:
: 以 C99 的角度來看,如果是 signed short,有可能發生未定義行為。
: 看 operands 的值來決定,是 right shift 或 left shift 也會
: 有影響。
:
: 詳見 C99 - 6.5.7 Bitwise shift operators
right shift(>>) 也就是做除法,在處理負數時要小心
因為出來的值,會和我們原本想要的不同
Ex:
#include <stdlib.h>
#include <stdio.h>
int main ()
{
printf("%d\n", -1235); //-1235
printf("%u\n", -1235); //4294966061
printf("%x\n", -1235); //fffffb2d
printf("%d\n", -1235 / 2); //-617
printf("%u\n", -1235 / 2); //4294966679
printf("%x\n", -1235 / 2); //fffffd97
printf("%d\n", -1235 >> 1);//-618
printf("%u\n", -1235 >> 1);//4294966678
printf("%x\n", -1235 >> 1);//fffffd96
printf("%d\n", -1235 * 2); //-2470
printf("%u\n", -1235 * 2); //4294964826
printf("%x\n", -1235 * 2); //fffff65a
printf("%d\n", -1235 << 1); //-2470
printf("%u\n", -1235 << 1); //4294964826
printf("%x\n", -1235 << 1); //fffff65a
system("pause");
}
Note: %u:表示unsigned 十進位顯示
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 123.110.129.50