char *buf; 函数verify用于校验buf中头4个字节的内容是不是'ABCD'4个字符 bool verify(char *buf) { uint32 a=0x44434241; return ((*(uint32 *)buf)==a); } 要求函数verify能在各种嵌入式环境中移植. 问题: 1,verify函数正确吗? 2,在什么环境下是正确的? 3,在什么环境下是不正确的? 答1: 由于没有考虑字节序,对齐等问题, 故verify函数是错误的. 答2: 在纯8位机小端模式下, 或者允许不对齐访问的x86系在CPU, verify函数能给出正确的结果. 答3: a,字节序的问题(大小端问题). 在几乎所有的机器上, 多字节对象被存储为连续的字节序列, 对象的地址为所使用字节序列中最低字节地址. 某些机器选择在存储器中按照从最低有效字节到最高有效字节的顺序存储对象, 这种最低有效字节在最前面的表示方式被称为小端法(little endian)(e.g.:Intel处理器上运行Linux,NT); 某些机器则按照从最高有效字节到最低有效字节的顺序储存, 这种最高有效字节在最前面的方式被称为大端法(big endian)(e.g.:Sun Microsystem UltraSPARC运行Solaris). b,对齐问题. 传递的buf指向的多字节对象的长度是4的倍数. c,字长问题. 对于纯16位或32位(不能以字节寻址)计算机, 如Ti的24和28系列cpu, 这类cpu的c编译器往往用一个16位或32位字存储一个字符, 把字符数组转换成32位数也不能得到正确的结果. |