[問題] Little/Big Endian判斷

作者: airwaves (airwaves)   2019-10-19 21:19:40
不好意思,問一個比較粗淺的問題>.<
int main(void)
{
short int a = 0x1234;
char *p = (char *)&a; =>為什麼一定要轉成char pointer呢?
printf("p=%#hhx\n",*p);
if(*p == 0x34)
printf("Little endian \n");
else if(*p == 0x12)
printf("Big endian \n");
else
printf("Unknow endian \n");
return 0;
}
作者: jerryh001   2019-10-19 21:27:00
讓他視為char array然後看p[0]寫啥就知道是哪種了
作者: Schottky (順風相送)   2019-10-19 23:01:00
這樣才能把兩個 byte 拆開來看啊另一個方法是用 union,雖說是換湯不換藥,原理相同
作者: dces4212 (flawless)   2019-10-20 03:48:00
不強制轉啊 只是編譯器會警告 跟你說你把記憶體位置給不同資料型態的指標 換句話說 他在警告你這樣在做valueof (dereference)操作的時候是取一個byte 而非4個byte
作者: lovejomi (JOMI)   2019-10-20 09:54:00
借此問個問題, short a=0xff00; char b=a;的值會因為endian而不一樣嗎?原理是什麼
作者: LPH66 (-6.2598534e+18f)   2019-10-20 10:33:00
樓上這種不會因 endianess 而不同, 所以原 PO 問的這寫法才會需要借用指標來做一個(其實標準沒說行不行的)間接存取
作者: lovejomi (JOMI)   2019-10-20 12:07:00
看到這種轉型的都覺得很可能是ub...到底是不是ub難道只能去查標準嗎
作者: CoNsTaR ((const *))   2019-10-20 13:50:00
樓上也可以像 LPH66 大大一樣通通背起來 XD
作者: ibmibmibm (BestSteve)   2019-10-22 16:13:00
轉型成char*讀內容是ub沒錯,要用memcpy複製出來https://www.youtube.com/watch?v=_qzMpk-22cc

Links booklink

Contact Us: admin [ a t ] ucptt.com