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在搞什么东东?
:(
网友评论2012-11-19 11:23:18
绅士亦花心
查了下FASM的文档(一个FAQ),我记得没错,下面是原文:
Why the instruction mov eax,'ABCD' is assembled into mov eax,44434241h? Shouldn't it be reversed?
Altough the most of other assemblers interpret quoted values treating the first character as the most significant, I've decided to use this different approach, just because it's more handy in the most situations. That's because for x86 architecture the least significant byte is the first byte in memory, so if you want to ch