Почему добавление двух типов переменных внутри sizeof () возвращает наибольшее значение размера переменной вместо их суммы? - PullRequest
7 голосов
/ 01 апреля 2020
#include <iostream>

using namespace std;

int main()
{
    int a;
    long b;

    cout<<sizeof(a+b);

    return 0;
}

Выходное значение 8 (размер длинной переменной). Почему он не возвращает их сумму?

Ответы [ 6 ]

16 голосов
/ 01 апреля 2020

вывод равен 8 (размер длинной переменной)

Из-за целочисленного продвижения .

Согласно cppreference. com :

ранги всех целочисленных типов со знаком различаются и растут с точностью: ранг знакового символа <ранг короткого <ранг int <ранг длинной int <ранг длинной long int </p>

Следовательно, a + b создает long, поскольку a равно int, а b равно long (ранг long больше, чем int).

Итак, у вас есть sizeof(long), что составляет 8 .

, почему оно не возвращает их добавление

Возможно, вы ищете для sizeof(a) + sizeof(b);

5 голосов
/ 01 апреля 2020

оператор sizeof возвращает размер в байтах (type) или expression.

a + b является выражением, а a повышается до long после неявного поэтому на вашем компьютере получается 8, то есть размер long.

. Для вычисления общего размера нескольких типов и / или выражений рассчитайте их отдельно и используйте сложение следующим образом:

auto total = sizeof(a) + sizeof(b) + sizeof(c+d);
4 голосов
/ 01 апреля 2020

Оператор sizeof возвращает размер указанного вами type в байтах. Поскольку вы сказали, что long - это 8 байт, я думаю, вы на x64. При этом, это то, что происходит:

Если ваши числа объявлены так:

int a;
long b;

Когда вы добавляете их вместе, выражение a+b оценивается как long тип и, следовательно, sizeof(a+b) совпадает с sizeof(long). Если вы хотите увидеть сумму их размеров, вам нужно два sizeof s:

sizeof(a) + sizeof(b);
2 голосов
/ 01 апреля 2020

Оператор sizeof не оценивает используемое выражение как его операнд. Он определяет тип выражения и возвращает размер, который может иметь объект типа.

Например, если у вас есть следующий фрагмент кода

int i = 10;
std::cout << sizeof( ++i ) << '\n';

, тогда значение переменной i не изменится.

Из стандарта C ++ 17 (5.3.3 Sizeof)

1 Оператор sizeof возвращает количество байтов в объектном представлении своего операнда , Операндом является либо выражение, которое является неоцененным операндом (раздел 5), либо идентификатор типа в скобках ....

Чтобы определить тип используемого выражения в этом размере операнда

cout<<sizeof(a+b);

выводится общий тип операндов аддитивного оператора + с использованием обычных арифметических c преобразований.

Поскольку ранг типа long равен чем ранг типа int, то общий тип выражения long, а оператор sizeof возвращает размер объекта типа long.

1 голос
/ 01 апреля 2020

Поскольку результирующий тип арифметической операции c совпадает с типом операндов (после их преобразования 1 ) и имеет тот же тип, также имеет тот же размер. Добавление не является операцией конкатенации байтов, которая приводит к тому, что байты обоих операндов соседствуют в памяти. Нет оснований ожидать, что тип результата будет иметь общий размер размеров операндов.

Рассмотрим программу, добавляющую целые числа в al oop. Если вы сложите вместе миллиард целых чисел, ожидаете ли вы, что результат будет размером в несколько гигабайт?

1 В частности, операнды сначала преобразуются в общий тип; на смешанных типах нет арифметических операций c. Короче говоря, общий тип больше из двух, который в данном случае равен long, размер которого в вашей системе равен 8 (и до этого было бы повышение до int, если бы был задействован меньший операнд) .

0 голосов
/ 05 апреля 2020

Из-за автоматов c приведение типа от int до float. При добавлении двух несовместимых типов данных наименее точный тип данных автоматически преобразуется в более точный тип данных. В этом случае int имеет 4 байта памяти, а long имеет 8 байтов памяти (конечно, в зависимости от архитектуры вашей системы). Поэтому int сначала преобразуется в long перед добавлением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...