функцию с сигнатурой
void test(unsigned long a);
переменную
int var = -2;
то компилятор во время переноса просто использует знаковое расширение? (не будем учитывать всякие оптимизации по типу constant propagation)
В стандарте C11 пишут следующее
6.3.1.3 Signed and unsigned integers
1 When a value with integer type is converted to another integer type other than _Bool, if
the value can be represented by the new type, it is unchanged.
2 Otherwise, if the new type is unsigned, the value is converted by repeatedly adding or
subtracting one more than the maximum value that can be represented in the new type
until the value is in the range of the new type
там глянь за integer oveflow, там вроде для unsinged это определеное поведение
А разве это overflow? Тут же никаких операций добавления
ну так ты передаешь в unsigned агрумент signed значение
Это не переполнение
Это не знаковое расширение. Результатом такого преобразования станет число по модулю 2^N, где N - ширина беззнакового типа. При этом представление чисел может быть как в допкоде, так и в каком-то другом виде. Поведение от этого не изменится
Неправильно. Перед вызовом функции значение переменной var будет преобразовано в unsigned long, и затем помещено в параметр функции. Поскольку -2 вне диапазона значений unsigned long, то это будет UB, и что передастся в функцию - неизвестно
Разве расширение или преобразование int (-2) в unsigned long (2 ^ (sizeof(unsigned long) - 1) - 2) это UB?
Я тут может что-то не так написал, возможно, UB тут нет. Надо посмотреть
Обсуждают сегодня