c++ - float - ¿Tengo la garantía de que sizeof(type)== sizeof(unsigned type)?
unsigned c (2)
El tamaño de char, int, long double ... puede variar de un compilador a otro. ¿Pero tengo la garantía de acuerdo con el estándar C ++ 11 o C11 de que el tamaño de cualquier tipo de integral fundamental con signo y sin signo es el mismo?
El estándar de C ++ 11 dice acerca de los tipos de enteros:
(§3.9.1 / 3) Para cada uno de los tipos de enteros con signo estándar, existe un tipo de entero sin signo estándar correspondiente (pero diferente): "carácter sin signo", "int corto sin signo", "int sin signo", "int sin signo largo ”, Y“ unsigned long long int ”, cada uno de los cuales ocupa la misma cantidad de almacenamiento y tiene los mismos requisitos de alineación (3.11) que el tipo de entero con signo correspondiente; es decir, cada tipo de entero con signo tiene la misma representación de objeto que su tipo de entero sin signo correspondiente. Del mismo modo, para cada uno de los tipos de enteros con signo extendido existe un tipo de enteros sin signo extendido correspondiente con la misma cantidad de requisitos de almacenamiento y alineación. [...]
Así que la respuesta es sí.
Para C11, hay una declaración correspondiente aquí (esto es de N1570):
(§6.2.5 / 6) Para cada uno de los tipos de enteros con signo, hay un tipo de entero sin signo correspondiente (pero diferente) (designado con la palabra clave sin firmar) que usa la misma cantidad de almacenamiento (incluida la información de signos) y tiene la misma requisitos de alineación [...]
Sí, hay una garantía total de que sizeof (tipo con signo) es igual a sizeof (tipo sin signo) ya que unsigned solo está tomando el espacio de números negativos del tipo con signo para aumentar su rango.