为什么sizeof('c')返回4而不是1?

时间:2012-01-02 15:26:59

标签: c

  

可能重复:
  Why are C character literals ints instead of chars?

http://ideone.com/lHYY8

int main(void)
{
        printf("%d %d\n", sizeof('c'), sizeof(char));
        return 0;
}

为什么sizeof('c')会返回4而不是1?

4 个答案:

答案 0 :(得分:16)

因为在C字符常量中具有类型int,而不是char。所以sizeof('c') == sizeof(int)。请参阅此C FAQ

  

也许令人惊讶的是,C中的字符常量的类型为int ,所以   sizeof('a')是sizeof(int)(尽管这是C ++的另一个区域   不同)。

答案 1 :(得分:4)

一种(可能甚至更极端)奇怪的是,这也是某种方式证明这一点,是字符文字仅限于单个字符这一事实。

试试这个:

printf("%d\n", 'xy');

这有时在处理例如使用32位“块”标识符的二进制文件格式,例如PNG。你可以这样做:

const int chunk = read_chunk_from_file(...);
if(chunk == 'IHDR')
  process_image_header(...);

这样的代码可能存在可移植性问题,当然上面的代码片段假设read_chunk_from_file()神奇地做了正确的事情,将PNG文件中找到的big-endian 32位值转换为匹配的东西相应的多字符字符文字的值。

答案 2 :(得分:2)

以下是来自着名C书籍的着名专栏 - The C programming Language Kernighan & Ritchie关于单引号之间的字符。

  

在单引号之间写入的字符表示一个整数值,该值等于机器字符集中字符的数值。

因此sizeof('a')相当于sizeof(int)

此问题与why sizeof('a') is 4 in C?

重复

答案 3 :(得分:1)

cnicutar当然是完全正确的。我只想补充其中的原因。如果你看一下函数行fgetc,你会发现它也返回一个int。这是因为char可以表示从0x000xFF的任何字符,但是为了表示EOF需要一个额外的值。因此,从输入或文件返回字符的函数通常返回一个int,可以将其与EOF进行比较,EOF通常定义为-1,但它可以是任何不是有效字符的东西。