Безопасно ли назначать bool или float для int32_t? - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть c++ проект, который имеет структуру с int32_t типом данных члена, и я хочу присвоить ему bool и float переменные, это разрушит значение переменной? Если да, что мне делать, кроме изменения типа данных члена структуры?

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

Назначаемое вами значение будет преобразовано в int32_t. Значение bool ничего не потеряет. Значение float будет усечено. Только его неотъемлемая часть будет сохранена.

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

Это зависит от того, какой тип значений, которые вы хотите сохранить, определяется во время выполнения или во время компиляции. Если это определено во время выполнения, вы можете использовать std :: any вместо int32_t:

#include <any>

struct MyStruct {
    std::any val;
};

// ...

MyStruct s;
s.val = true; // val now contains a bool
s.val = 3.1415; // val now contains a double
s.val = 3.1415f; // val now contains a float
s.val = 42; // val now contains an int

Если тип определяется во время компиляции, вы можете создать шаблон структуры:

template <typename T>
struct MyStruct {
    T val;
};

// ...

MyStruct<bool> s1;
s1 = false;

MyStruct<float> s2;
s2 = 3.1415;
0 голосов
/ 18 апреля 2019

Всякий раз, когда компилятор должен использовать значение типа в контексте, где ожидается другой тип, выполняется неявное преобразование.

Правила для неявных преобразований многочисленны , нов разделе Преобразования с плавающей запятой есть следующий параграф:

Значение типа с плавающей запятой может быть преобразовано в значение любого целочисленного типа.Дробная часть усекается, то есть дробная часть отбрасывается.Если значение не может вписаться в тип назначения, поведение не определено (даже если тип назначения не имеет знака, арифметика по модулю не применяется).Если типом назначения является bool, это логическое преобразование (см. Ниже).

Таким образом, вы можете безопасно назначать тип с плавающей запятой (например, float или double) целому числу.При условии, что значение может соответствовать, десятичная часть будет усечена.Это подразумевает потерю данных и может быть источником ошибок или может быть сделано намеренно в определенных приложениях.Обратите внимание, что типы с плавающей запятой имеют больший диапазон, чем int32_t, и если значение не может быть сохранено, это неопределенное поведение в соответствии со стандартом.

С другой стороны, Bools может быть безопасно назначенцелочисленные типы при любых обстоятельствах:

Если тип источника - bool, значение false преобразуется в ноль, а значение true преобразуется в значение один из типа назначения (обратите внимание, что если тип назначенияis int, это целочисленное продвижение, а не целочисленное преобразование).

...