2012年(158)
分类: C/C++
2012-11-19 11:22:23
不常用的一个字符常量(character constant )用法
在C/C++中,如果错将"abcd"写成'abcd'依然是合乎语法的,猜想必然有其意图,但一直以来找不到其适用之处,也就作罢。今日需要定义一个int类型表示的字符数组,原本使用
const
int fg = *(int*)"ABCD";
感觉有两点不是很好:
a. 需要强制类型转化,看起来有点复杂;
b.
可执行文件中必然需要包含一个"ABCD",理论上这其实是不需要的。
于是就尝试一下“字符常量”看看行不行,写成
'ABCD'
开始感觉不错,因为'A'是0x41,'B'是0x42,'C'是0x43,'D'是0x44,那么'ABCD'就是0x41424344
需要注意的是'ABCD'不一定等同于"ABCD"的前四位,在little-endian上
"ABCD"的前四位在内存的排布是
0x41, 0x42, 0x43, 0x44;
而'ABCD'即0x41424344在内存的排布是 0x44, 0x43, 0x42,
0x41;
所以在little-endian上等同于 *(int*)"ABCD" 的常量应当是
'DCBA'。
写成'DCBA'有点不习惯,所以最终还是改为*(int*)"ABCD"了
^_^。
后记:晕了,晕了,对于如下代码:
printf( "0x%08X\n", '\x31\x32\x33\x34'
);
printf( "0x%08X\n", '1234' );
在 windows2k + gcc3.4.2 中输出是 0x31323334 和
0x31323334;
而在windows2k + VC6.0 中输出是 0x34333231 和 0x31323334,不知道VC6在搞什么东东?
:(