Chinaunix首页 | 论坛 | 博客
  • 博客访问: 824267
  • 博文数量: 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在搞什么东东? :(

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

网友评论2012-11-19 11:26:26

yellow
这个我以前在写Shellcode时用到过,在PE引出表里比较函数名时就用过,代码片段如下:

是一个查找GetProcAddress函数引出地址的一段代码
....
cmp dword ptr[ebx],'PteG';
jne skip
cmp dword ptr[ebx+4],'Acor'
jne skip
cmp dword ptr[ebx+8],'erdd'
jne skip
jmp found
......

网友评论2012-11-19 11:26:13

一笑
不客气的说,全是擦边球!^_^  

偶来给个正解吧:
http://blog.vckbase.com/smileonce/archive/2005/04/06/4435.html

网友评论2012-11-19 11:25:59

erictb
我是这样认为的:(和绅士亦花心是类似的 )
"ABCD"被当作字符串,所以存储的时候不会考虑大字头和小字头的问题。所以按照顺序为41 42 43 44
但"ABCD"被(int *)后,被强制转换为一个 int类型,那么 编译器在解释的时候按照44 43 42 41排列(这个是编译器的行为,就象楼上说的是“逻辑”的)

int const f2='ABCD'本来就是当作一个int 来处理,所以在存储的时候,就需要按照“小字头”的编码顺序来存储,即:44 43 42 41

但这个解释基于一个前提:
通俗的说:在小字头的机器中,只有数字的东西 才按照小字头编码(倒序),字符串的东西,不按照小字头编码(按照从左到右的顺序存储)

网友评论2012-11-19 11:25:30

绅士亦花心
怎么发表?

直接在论坛发贴吗?

网友评论2012-11-19 11:25:04

绅士亦花心
星星:
请教一下,VCKBASE的BLOG如何申请呀?