Предопределено ли присвоение типу данных значения, не помещающегося в этот тип данных?

В C++ операция присвоения не является предопределенной для случая, когда значение не помещается в тип данных. Если вы пытаетесь присвоить значение, которое не может быть представлено в переменной определенного типа, то в поведении программа может быть непредсказуема и привести к ошибке, называемой переполнением.

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

Рассмотрим несколько примеров, чтобы лучше понять это:

#include <iostream>

int main() {
    // Попытка присвоить значение, которое превышает максимальное допустимое значение для типа int
    int number = 2147483648; // Здесь значение 2147483648 выходит за пределы диапазона -2147483648 до 2147483647
    std::cout << number << std::endl; // Выведет некорректное значение (-2147483648)
    
    // Попытка присвоить отрицательное значение uint8_t
    uint8_t byte = -1; // Здесь значение -1 отрицательно, но тип uint8_t может хранить только неотрицательные числа в диапазоне от 0 до 255
    std::cout << static_cast<int>(byte) << std::endl; // Выведет некорректное значение 255
    
    return 0;
}

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