Почему 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 ответов:
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'
Если вы затем используете отладчик для проверки переменной, все становится ясно:
вы можете увидеть, что переменная на самом деле является
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
.