作者airwaves (airwaves)
看板C_and_CPP
標題[問題] Little/Big Endian判斷
時間Sat Oct 19 21:19:40 2019
不好意思,問一個比較粗淺的問題>.<
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;
}
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.44.64.61 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1571491182.A.B73.html
1F:推 jerryh001: 讓他視為char array 10/19 21:27
2F:→ jerryh001: 然後看p[0]寫啥就知道是哪種了 10/19 21:28
3F:推 Schottky: 這樣才能把兩個 byte 拆開來看啊 10/19 23:01
4F:→ Schottky: 另一個方法是用 union,雖說是換湯不換藥,原理相同 10/19 23:02
5F:→ dces4212: 不強制轉啊 只是編譯器會警告 跟你說你把記憶體位置給 10/20 03:48
6F:→ dces4212: 不同資料型態的指標 換句話說 他在警告你這樣在做value 10/20 03:48
7F:→ dces4212: of (dereference)操作的時候是取一個byte 而非4個byte 10/20 03:48
8F:→ dces4212: 10/20 03:48
9F:推 lovejomi: 借此問個問題, short a=0xff00; char b=a;的值會因為en 10/20 09:54
10F:→ lovejomi: dian而不一樣嗎?原理是什麼 10/20 09:54
11F:推 LPH66: 樓上這種不會因 endianess 而不同, 所以原 PO 問的這寫法 10/20 10:33
12F:→ LPH66: 才會需要借用指標來做一個(其實標準沒說行不行的)間接存取 10/20 10:34
13F:推 lovejomi: 看到這種轉型的都覺得很可能是ub...到底是不是ub難道只 10/20 12:07
14F:→ lovejomi: 能去查標準嗎 10/20 12:07
15F:推 CoNsTaR: 樓上也可以像 LPH66 大大一樣通通背起來 XD 10/20 13:50
16F:推 ibmibmibm: 轉型成char*讀內容是ub沒錯,要用memcpy複製出來 10/22 16:13