Почему sizeof (unsigned double) равен 4?
Один из моих коллег спросил, нет ли беззнакового двойника, и я сказал, что нет, но я все еще проверил его, и он компилируется в Microsoft Visual С++ 2010
unsigned double a;
double b;
printf("size_a=%d size_b=%d", (int) sizeof(a), (int) sizeof(b));
Он выводит size_a=4 size_b=8
. То есть четыре байта для unsigned double
и восемь байтов для double
.
Ответы
Ответ 1
unsigned double
недействителен. Это также верно в MSVC.
При компиляции вышеуказанного кода в MSCV 2010 с включенными предупреждениями вы получаете:
warning C4076: 'unsigned' : can not be used with type 'double'
Компилятор фактически игнорирует double
после unsigned
, делая ваш a
фактически unsigned int
.
Если вы попробуете следующее:
unsigned double a = 1.0;
На самом деле вы получаете два предупреждения:
warning C4076: 'unsigned' : can not be used with type 'double'
warning C4244: 'initializing' : conversion from 'double' to 'unsigned int', possible loss of data
Интересно, что в MSDN для VS2010 нет предупреждения C4076. Он присутствует только для VS2005 и VS2008.
Ответ 2
Если вы установите уровень предупреждения выше (/W3 в моем тесте), вы получите соответствующее предупреждение:
предупреждение C4076: 'unsigned': не может использоваться с типом 'double'
Если вы затем используете отладчик для проверки переменной, все становится ясным:
![enter image description here]()
Вы можете видеть, что переменная на самом деле является unsigned int
Ответ 3
Объединение unsigned
с double
в последовательности спецификатора объявления недействительно С++. Это должно быть расширение MSVC (или ошибка).
Как правило, в полном объявлении-спецификаторе-seq объявления или в типе-спецификаторе-seq или в конце-типе-спецификаторе-seq допускается не более одного спецификатора типа. Единственными исключениями из этого правила являются следующие:
-
const
можно комбинировать с любым спецификатором типа, кроме самого себя. -
volatile
можно комбинировать с любым спецификатором типа, кроме самого себя. -
signed
или unsigned
можно комбинировать с char
, long
, short
или int
. -
short
или long
можно комбинировать с int
. -
long
можно комбинировать с double
. -
long
можно комбинировать с long
.
Ответ 4
Неподписанные и подписанные действуют как классификаторы типов в MSVC, где это возможно (без знака char, подписанный короткий и т.д.). Если это невозможно сделать, например unsigned bool или signed double, запрошенный тип не создается. И тип просто обрабатывается как unsigned [int] и подписан [int].
Ответ 5
Это ошибка в VS2010. VS2012 дает следующую ошибку для этой строки кода.
error CS1002: ; expected
Ожидается ';' перед ключевым словом "double".