Почему sizeof (unsigned double) равен 4?


мой коллега спросил, есть ли unsigned double, и я сказал, что нет, но я все равно проверил его, и это компилируется в Microsoft Visual C++ 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.

5 71

5 ответов:

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.

Если вы установите уровень предупреждения выше (/W3 в моем тесте), вы получите соответствующее предупреждение:

предупреждение C4076: 'unsigned': не может использоваться с типом 'double'

Если вы затем используете отладчик для проверки переменной, все становится ясно:

enter image description here

вы можете увидеть, что переменная на самом деле является unsigned int

объединение unsigned с double в описателе объявления недопустима последовательность c++. Это должно быть расширение MSVC (или ошибка) какого-то рода.

как правило, не более одного тип-описатель допускается в полном Децл-спецификатор-seq декларации или Type-specifier-seq или trailing-type-specifier-seq. Единственными исключениями из этого правила являются следующие:

  • const может быть объединен с любым типом спецификатора, кроме самого себя.
  • volatile может быть объединен с любым типом спецификатора, кроме самого себя.
  • signed или unsigned можно комбинировать с char,long,short или int.
  • short или long можно комбинировать с int.
  • long можно комбинировать с double.
  • long можно комбинировать с long.

Unsigned и signed действуют как квалификаторы типов в MSVC, где это возможно (unsigned char, signed short и т. д.). Если это невозможно сделать, например unsigned bool или signed double, запрошенный тип не создается. И тип просто обрабатывается как unsigned [int] и signed [int].

Это ошибка в VS2010. VS2012 дает следующую ошибку для этой строки кода.

error CS1002: ; expected

Он ожидает'; 'перед ключевым словом 'double'.