Chinaunix首页 | 论坛 | 博客
  • 博客访问: 826314
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

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在搞什么东东? :(

阅读(3401) | 评论(21) | 转发(0) |
给主人留下些什么吧!~~

网友评论2012-11-19 11:23:44

绅士亦花心
little-endian/big-endian与实现对'ABCD'的解释无关!

你可以说在little-endian机子上"ABCD"是41,42,43,44,但不能说在little-endian的机子上对'ABCD'的解释就是41,42,43,44。

一个硬件机制,一个是软件的解释。比如,虽然你是好人,但我看你就是不顺眼。

^_^

网友评论2012-11-19 11:23:33

周星星
原文中已经标明了“little-endian”。
看了您的跟贴真长知识,希望不啻赐教,谢谢!

网友评论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

网友评论2012-11-19 11:23:05

绅士亦花心
'ABCD'的排列顺序(即到底是0x41424344还是0x44434241)和具体的实现相关,你应该用的VC吧。

不知你用过FASM吗?在我的印象里它是把'ABCD'解释为0x44434241的。