懂C\C++的进来看看

来源:百度知道 编辑:UC知道 时间:2024/07/02 14:28:03
我一时不明白双引号中和单引号中的ASCII码和汉字各占多少字节,就写了一个程序,如下:

a=sizeof("a");//双引号的
b=sizeof("我");//双引号的
c=sizeof('a');//单引号的
d=sizeof('我');//单引号的

结果是:
a=2
b=3
c=1
d=4

我知道ASCII码占一个字节,汉字占两个字节,双引号的是字符串,有一个'\0'在后,这就解释了前三个,

但我不明白d为什么是4.
明白的请给我指点一下
我想知道的是d为什么是4!!!!!

我的系统是windows xp
我的编译器是VC6.0

其实LZ的写法一点都没错,为什么是4呢?让我们看看编译器到底做了什么,看我的程序:
#include <stdio.h>

int main()
{
int a,b,c,d;char k;
a=sizeof("a");
b=sizeof("我");
c=sizeof('a');
d=sizeof('我');
k='我';
printf("%d %d %d %d",a,b,c,d);

}

在k='我'那里设置断点,然后debug,转汇编看看...呵呵出来了:
9: a=sizeof("a");
00401028 mov dword ptr [ebp-4],2
10: b=sizeof("我");
0040102F mov dword ptr [ebp-8],3
11: c=sizeof('a');
00401036 mov dword ptr [ebp-0Ch],1
12: d=sizeof('我');
0040103D mov dword ptr [ebp-10h],4
我们发现:sizeof('我')直接就赋值了4,为什么呢,关键看看下面:
13: k='我';
00401044 mov byte ptr [ebp-14h],0D2h
什么?0D2h,这是一个int值了,其实由于'我'不是ASCII所以其实他是一个4字节字符,也就是计算机用int值而不是char值来存储汉字'我',这样就好理解了,int在32位计算机里面当然是4字节呵呵.其实LZ如果用VC,会发现编译器做了warning: trun