我有一些现有的代码,我曾经用它写出一个图像到位图文件.其中一行代码如下所示:
bfh.bfType='MB';
我想我可能是从某个地方复制过的.其他开发者之一对我说"看起来不对,是不是应该是'BM'?" 无论如何它似乎确实工作正常,但在代码审查它被重构为:
bfh.bfType=*(WORD*)"BM";
谷歌搜索表明大部分时间,第一行似乎被使用,而有些人会这样做:
bfh.bfType=0x4D42;
那么区别是什么呢?他们怎么能给出正确的结果呢?无论如何,多字节字符常量意味着什么?他们真的一样吗?
这三个都是(可能)等同的,但出于不同的原因.
bfh.bfType=0x4D42;
这是最容易理解的,它只是加载bfType,其数字恰好代表位8-15中的ASCII"M"和位0-7中的ASCII"B".如果以little-endian格式将其写入流中,则流将包含"B","M".
bfh.bfType='MB';
这基本上等同于第一个语句 - 它只是表达整数常量的另一种方式.它可能完全取决于编译器对它的作用,但它可能会根据您编译的机器的字节序生成一个值.如果你在同一个endian-ness的机器上编译和执行,那么当你在流上写出值时,你应该得到'B','M'.
bfh.bfType=*(WORD*)"BM";
这里,"BM"使编译器创建一个看起来像'B','M','\ 0'的数据块,并获得一个指向它的char*.然后将其转换为WORD*,这样当它被解除引用时,它将把内存读作WORD.因此它在机器具有的任何字节序中将'B','M'读入bfType.使用相同的endian-ness写出它显然会在你的流上加上'B','M'.只要您只使用bfType写出流,这是最便携的版本.但是,如果您正在使用bfType进行任何比较/等等,那么最好选择一个endian-ness,并在读取或写入值时根据需要进行转换.