[問題] 關於 casting (強制轉換)

作者: EngRookie (EngRookie)   2017-05-04 19:55:21
小弟又來問基礎問題了 (掩面)
舉個例子
unsigned short s = 600; //0000 0010 0101 1000
unsigned char c = (unsigned char) s;
printf("char c = %d\n", c); //顯示截取到 0101 1000
char *ptrS = &s; //points to short s 但是大小改為char
printf("*ptrS = %d\n", *ptrS); //一樣是指到 0101 1000
我知道這看起來有點理所當然
也大概知道這應該跟作業系統的記憶體分配有關係 但是我就是覺得怪怪的
為什麼 我的 c 跟 ptrS 不能指向 0000 0010 這個位址較高(?)的 byte 呢?
為什麼是指向較低位元(0101 1000)的部分呢?
(其實我也不確定前八bits是高位元還是低位元 冏)
作者: james732 (好人超)   2017-05-04 19:59:00
看起來是跟little/big endian有關
作者: EngRookie (EngRookie)   2017-05-04 20:01:00
恩...就覺得怪怪的想請教大家一下 哈哈
作者: sodas500i (想吃什麼,你請客)   2017-05-04 20:07:00
畫圖不是就知道了嗎呃
作者: pttworld (批踢踢世界)   2017-05-04 20:15:00
其實都知道較低位元那只要弄懂機器那種存法就好了
作者: kokal (細菌)   2017-05-04 20:25:00
你寫的code是check big/little endian的一種方法
作者: steve1012 (steve)   2017-05-04 23:17:00
因為你的電腦是這樣存的 應該可以移動cage pointer 去找下一位現在大部分都是little endian 不過懂得怎麼判斷也蠻好的還是有big endian 的機器
作者: Killercat (殺人貓™)   2017-05-05 08:23:00
不只機器,IPv4目前全都是跑Big Endian所以才會有一堆什麼htons這些東西
作者: s25g5d4 (function(){})()   2017-05-05 21:37:00
我記得 ARM 是跑 Big Endian? 可是又好像有印象可以切換
作者: ah7675 (阿毛)   2017-05-05 21:48:00
ARM -> little, MIPS -> big網路傳輸統一big 又稱network order
作者: descent (「雄辯是銀,沉默是金」)   2017-05-06 11:18:00
power pc 是 big endian, ppc mac 可以試試

Links booklink

Contact Us: admin [ a t ] ucptt.com