Подтвердить что ты не робот

Почему 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.

4b9b3361

Ответ 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".