71 votes

Pourquoi la sizeof(unsigned double) est égal à 4 ?

Un de mes collègues a demandé si il n’y a non signé en double et je l’ai dit il n’existe pas, mais je l’ai vérifié encore, et il compile dans Microsoft Visual C++ 2010:

Elle génère . Autrement dit, quatre octets pour les et huit octets de `` .

141voto

CygnusX1 Points 8578

unsigned double n'est pas valide. Cela est également vrai dans MSVC. Lors de la compilation le code ci-dessus dans MSCV 2010 avec des avertissements activé, vous bénéficiez de:

warning C4076: 'unsigned' : can not be used with type 'double'

Le compilateur fait ignore double après unsigned, ce qui rend votre a fait un unsigned int.

Si vous essayez ce qui suit:

unsigned double a = 1.0;

Vous obtenez en fait deux mises en garde:

warning C4076: 'unsigned' : can not be used with type 'double'
warning C4244: 'initializing' : conversion from 'double' to 'unsigned int', possible loss of data

Fait intéressant, il n'y a pas de C4076 avertissement dans MSDN pour VS2010. Il est présent uniquement pour VS2005 et VS2008.

26voto

Clifford Points 29933

Si vous définissez le niveau d’alerte plus élevé (/ W3 dans mon test), vous obtiendrez un avertissement approprié :

AVERTISSEMENT C4076 : « unsigned » : ne peut pas être utilisé avec le type « double »

Si vous utilisez ensuite le débogueur pour inspecter la variable, tout devient clair :

enter image description here

Vous pouvez voir que la variable est en fait un``

24voto

Joseph Mansfield Points 59346

Combinant unsigned avec double dans la déclaration spécificateur de séquence n'est pas valide en C++. Ce doit être un MSVC extension (ou bug) d'une certaine sorte.

En règle générale, plus d'un type de spécificateur est autorisé dans les decl-spécificateur-séquence d'une déclaration ou à un type de spécificateur-seq ou de fuite de type spécificateur-seq. Les seules exceptions à cette règle sont les suivantes:

  • const peut être combiné avec n'importe quel type de prescripteur, sauf lui-même.
  • volatile peut être combiné avec n'importe quel type de prescripteur, sauf lui-même.
  • signed ou unsigned peut être combiné avec d' char, long, shortou int.
  • short ou long peut être combiné avec d' int.
  • long peut être combiné avec d' double.
  • long peut être combiné avec d' long.

4voto

Boyko Perfanov Points 1484

Unsigned et signé l’acte comme qualificatifs type en MSVC lorsque c’est possible (unsigned char, signé bref etc.). Si il est impossible de le faire, tels que bool non signé ou signé double, du type demandé n’est pas créé. Le type est simplement traité comme non signé [int] et signée [int].

2voto

CramerTV Points 460

C’est un bug dans VS2010. VS2012 donne l’erreur suivante pour cette ligne de code.

Il s’attend à un « ; » avant le mot clé « double ».

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X