看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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