web-dev-qa-db-fra.com

Pourquoi l'ajout de deux types de variables dans sizeof () retourne-t-il la plus grande valeur de taille de variable au lieu de leur somme?

#include <iostream>

using namespace std;

int main()
{
    int a;
    long b;

    cout<<sizeof(a+b);

    return 0;
}

La sortie est 8 (taille d'une variable longue). Pourquoi ne retourne-t-il pas leur somme?

8

L'opérateur sizeof n'évalue pas l'expression utilisée comme son opérande. Il détermine le type de l'expression et renvoie la taille qu'un objet du type peut avoir.

Par exemple, si vous avez l'extrait de code suivant

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

alors la valeur de la variable i ne sera pas modifiée.

À partir de la norme C++ 17 (5.3.3 Sizeof)

1 L'opérateur sizeof donne le nombre d'octets dans la représentation objet de son opérande. L'opérande est soit une expression, qui est un opérande non évalué (Clause 5), soit un type-id entre parenthèses ....

Pour déterminer le type de l'expression utilisée dans cette taille d'opérande

cout<<sizeof(a+b);

on en déduit le type commun des opérandes de l'opérateur additif + en utilisant les conversions arithmétiques usuelles.

Comme le rang du type long est supérieur au rang du type int, le type commun de l'expression est long et l'opérateur sizeof renvoie la taille d'un objet de type long.

2
Vlad from Moscow

Parce que le type résultant d'une opération arithmétique est le même que le type des opérandes (après leur conversion 1), et étant du même type, a également la même taille. L'addition n'est pas une opération de concaténation d'octets qui entraînerait des octets des deux opérandes côte à côte dans la mémoire. Il n'y a aucune raison de s'attendre à ce que le type de résultat ait la taille totale des tailles d'opérande.

Considérons un programme ajoutant des entiers dans une boucle. Si vous additionnez un milliard d'entiers, vous attendriez-vous à ce que le résultat soit de la taille de quelques gigaoctets?

1 Plus précisément, les opérandes sont d'abord convertis en un type commun; il n'y a pas d'opérations arithmétiques sur les types mixtes. En bref, le type commun est le plus grand des deux, qui dans ce cas est long dont la taille sur votre système se trouve être 8 (et avant cela, il y aurait eu une promotion vers int, s'il y avait un plus petit opérande impliqué).

1
eerorika

En raison de la conversion automatique du type de int en float. Lorsque deux types de données incompatibles sont ajoutés, le type de données le moins précis est automatiquement converti en type de données plus précis. Dans ce cas, int a 4 octets de mémoire et long a 8 octets de mémoire (bien sûr, selon l'architecture de votre système) C'est pourquoi int est d'abord converti en long avant d'ajouter.

0
Aroo