这是我刚入职时遇到的一道考题:
设a为char类型,b为int类型,那么a = (char)b等效于 a = b & 0xff; √
设a为char类型,b为int类型,那么a = (char)b等效于 a = *(char *)&b; ×
在论坛上请教了一些高手,现在总结一下,如有错误还希望指正一下。
设a为char类型,b为int类型,那么a = (char)b等效于 a = b & 0xff; √
假设b = 0x12345678,a = (char)b等价于取b地址的第一个字节,0xff应该当作一个整型来看待,即0x000000ff.
假设存储是little-endian,那么在内存中b的实际存储为78 56 34 12,0xff为ff 00 00 00,那么b & 0xff在内存中是78 00 00 00,元算后又得转换显示出00 00 00 78即78.
假设存储是big-endian,那么在内存中b的实际存储为12 34 56 78,0xff为00 00 00 78,那么 b & 0xff在内存中是00 00 00 00 78,运算后不需转换显示出00 00 00 78. 由此我想到一点,就是little-endian的存储需要两次转换,而big-endian的存储不需要转换。设a为char类型,b为int类型,那么a = (char)b等效于 a = *(char *)&b;
设a为char类型,b为int类型,那么a = (char)b等效于 a = *(char *)&b; ×
(char*)&b等价于取b的地址,然后把这个整型转换成char*的地址,这个地址指向b的首地址,所以a = *(char*)&b就相当于取b第一个地址所存储的数值。
假设b = 0x12345678
假设为little-endian,那么b在内存中是78 56 34 12,因此,此时a = 78;正确
假设为big-endian,那么b在内存中是12 34 56 78,因此,此时a = 12;错误