[问题] 关于 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