почему sizeof (13,33) равен 8 байтам? - PullRequest
8 голосов
/ 04 апреля 2011

Когда я даю sizeof(a), где a=13.33, переменная с плавающей запятой, размер составляет 4 байта. Но если я даю sizeof(13.33) напрямую, размер составляет 8 байт.

Я не понимаю, что происходит. Может кто-нибудь помочь?

Ответы [ 5 ]

43 голосов
/ 04 апреля 2011

Это правила языка.

13.33 - числовой литерал.Это рассматривается как двойной, потому что это двойной.Если вы хотите, чтобы 13.33 обрабатывался как литерал с плавающей запятой, вы должны указать 13.33f.

13.33 - двойной литерал.Если sizeof (float) == 4, то sizeof (13.33f) == 4 также должен выполняться, поскольку 13.33f является литералом с плавающей точкой.

19 голосов
/ 04 апреля 2011

Литерал 13.33 обрабатывается как значение с плавающей запятой двойной точности, шириной 8 байт.

13 голосов
/ 04 апреля 2011

Литерал 13.33 обрабатывается как "double", а не как "float".

Вместо этого попробуйте 13.33f.

9 голосов
/ 04 апреля 2011

Тип и размер вашей переменной в порядке. Просто у компилятора есть несколько типов по умолчанию для литералов, эти константы жестко запрограммированы в вашей программе .

Если вы запросите sizeof(1), вы получите sizeof(int).Если вы запросите sizeof(2.5), вы получите sizeof(double).Они явно вписываются в char и float соответственно, но компилятор имеет типы по умолчанию для ваших литералов и будет обрабатывать их как таковые до присваивания.

Однако вы можете переопределить это поведение по умолчанию.Например:

2.5 // as you didn't specify anything, the compiler will take it for a double.
2.5f // ah ha! you're specifying this literal to be float

Приветствия!

8 голосов
/ 04 апреля 2011

Поскольку 13.33 - это double, которое усекается до float, если вы его назначите.И double составляет 8 байт.Чтобы создать реальное плавание, используйте 13.33f (обратите внимание на f).

...