为什么在 sizeof() 中添加两个变量类型会返回最大的变量大小值而不是它们的总和?

San*_*iya 8 c++ sizeof

#include <iostream>

using namespace std;

int main()
{
    int a;
    long b;

    cout<<sizeof(a+b);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出为 8(长变量的大小)。为什么它不返回它们的总和?

Ard*_*der 16

输出为 8(长变量的大小)

因为整数提升

根据cppreference.com

所有有符号整数类型的等级都是不同的,并且随着它们的精度增加:有符号字符的等级<短的等级<整数的等级<长整数的等级<长长整数的等级

因此,a + b产生一个long因为aintblong(long 的等级大于 int)。

所以,你有sizeof(long)which 是8

为什么它不返回他们的添加

您可能正在寻找 sizeof(a) + sizeof(b);


Aze*_*eem 5

sizeof 运算符返回 a(type)或 的字节大小expression

a + b是一个表达式并在隐式转换后被a提升,long这就是结果8在您的机器上的原因,即long.

要计算多个类型和/或表达式的总大小,请分别计算它们并像这样使用加法:

auto total = sizeof(a) + sizeof(b) + sizeof(c+d);
Run Code Online (Sandbox Code Playgroud)


eer*_*ika 1

因为算术运算的结果类型与操作数的类型相同(转换后1),并且类型相同,大小也相同。加法不是字节连接操作,不会导致两个操作数的字节在内存中并排。没有理由期望结果类型具有操作数大小的总大小。

考虑一个在循环中添加整数的程序。如果将 10 亿个整数加在一起,您会期望结果有几 GB 大小吗?

1具体来说,首先将操作数转换为普通类型;混合类型上没有算术运算。简而言之,通用类型是两者中较大的一个,在本例中,long它在您的系统上的大小恰好是 8(在此之前,如果涉及较小的操作数,则会升级为 int)。