sizeof 运算符对于(char + short)返回4。

7

考虑以下代码片段:

    #include <stdio.h>

    int main() {

        short i = 20;
        char c = 97;

        printf("%d, %d, %d\n", sizeof(i), sizeof(c), sizeof(c + i));

        return 0;
    }

Why is sizeof(c + i) == 4?


9
整数提升? - nouney
4
首先加上(c+i),然后计算结果的大小,得到一个整数,因此大小为4。 - Raghu Srikanth Reddy
4
Nitpick: sizeof 不是一个函数,而是一个运算符。 - milleniumbug
1
请记住:sizeof()是编译时运算符,表达式的类型在编译时已知,在C语言中的算术类型操作需要将两个操作数转换为一个公共类型--称为整数提升。 - Grijesh Chauhan
1
@RaghuSrikanthReddy:没有执行加法操作。sizeof在编译时进行操作,除了VLA的情况外。 - phoxis
3个回答

17

c + i是一个整型表达式(整型提升!),因此sizeof()返回sizeof(int)


5

比 int 小的整数类型在进行运算时会被提升。 如果原始类型的所有值都可以表示为 int,则较小的类型的值将转换为 int; 否则,它将转换为无符号 int。

整数提升需要将每个变量(c 和 i)提升到 int 大小。

short i = 20;
char c = 97;  
//The two int values are added and the sum is truncated to fit into the char type.
char a = c + i;
printf("%d, %d, %d %d\n", sizeof(i), sizeof(c), sizeof(c + i),sizeof(a));  

2, 1, 4 1

与大家分享有趣的章节:运算符转换:算术转换 - Grijesh Chauhan

3

C语言在所有整数计算中默认使用int类型,除非另有规定。在您的平台上,int显然是32位长的,因此sizeof返回4。如果您的编译器使用64位整数,则会返回8


有点离题,但是是否有已知使用64位整数的编译器? - keltar
这更多关乎实际的架构 - 例如SPARC64 - ILP64/SILP64。 - Jan Spurny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接