Вопрос

Я стараюсь понять, когда кастинг вызывает увольнение данных и то, как это работает. Поэтому для следующих примеров я стараюсь понять, есть ли потеря данных, и если да, почему: (i - int(4),f - float(4),d-double(8))

i == (int)(float) i; // sizeof(int)==sizeof(float) <- no loss
i == (int)(double) i; // sizeof(int)!=sizeof(double) <- possible loss
f == (float)(double) f;// sizeof(double)!=sizeof(float) <- possible loss
d == (float) d;// sizeof(double)!=sizeof(float) <- possible loss

Достаточно ли основывать ответ только на размерах типов? (+ Round)

Это было полезно?

Решение

Предполагая, что 32-битные INT и нормальные 4 и 8 байтов IEEE-754 поплавки/удвоение это будет:

i == (int)(float) i;     // possible loss (32 -> 23 -> 32 bits)
i == (int)(double) i;    // no loss (32 -> 52 -> 32 bits)
f == (float)(double) f;  // no loss (23 -> 52 -> 23 bits)
d == (float) d;          // possible loss (52 -> 23 -> 52 bits)

Обратите внимание, что int имеет 32 бит точной, Float имеет 23 бита, Double имеет 52.

Другие советы

Память, выделенная для хранения переменной типа, является не единственным фактом для вас, чтобы рассмотреть потерю данных. Как правило, путь к круглосуточности и то, как процессора обрабатывает числовые данные в случае переполнения, будут другие аспекты, которые вы, возможно, захотите изучить.

Поскольку sizeof Отчеты о том же размере в памяти не означает, что есть потеря данных.

Рассмотрим 0,5.

Можно сохранить это в поплавке, но не может хранить его в целом.

Поэтому потеря данных.

Т.е. я хочу 0,5 этого торта. Не может представлять это как целое число. Либо не получите ничего, либо много тортов. Мрачный

Почему целое число? потому что вам могут понадобиться только целочисленные числа, например, ID_num

Зачем плавать? Потому что вам может потребоваться поработать над примером реальных чисел % calculations

Зачем двойной? Когда у вас есть реальные числа, которые не могут вписаться в размер плавания

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top