char charvar{static_cast<char>(intvar)};
гадалка подсказала: int x = 8; char c = '0' + x;
Сейчас попробую
int a = calc_a(); char b = a & 0xFF
Красивый пример уб...
Чтение неинициализированной переменной
ну я сократил пример) очевидно, там есть где-то инициализация
Я бы на месте компиля ворнинг выдал...
некорректно. char это в основном (у меня) = signed char тоесть с отрицательными все плохо в этом примере
Не за отсутствие инициализации ворнинг :)
в чём некорректность?
signed-unsigned преобразования
```int a = -1; char your_char = a&0xFF; // your_char == 0xFF here
ну это не UB
Епрст. Я же не говорю, что UB😊
даже с -funsigned-char тут нет проблемы
На это нельзя полагаться. Пиши явно.
your_char будет равно -1. а unsigned char == 255
конкретно тут неочень пример... тут как рас верно )) но.. с отрицательными значекниями меньше чем -128 все плохо
ну не то, что плохо. вполне ожидаемо )
а за сужающее преобразование не?
а его тут нет. ни g++, ни clang не выдают варнинга
int x = 256; char c{ x };
то, что не выдают, еще не значит, что его нет
если его не выдают, то его действительно нет :)
static_assert(std::is_same_v<int, decltype(int{} & 0xFF)>); это компилируется, если что
вот можете привести кейс, в котором данное преобразование будет некорректным? считаем, что значение инта априори попадает во множество конвертируемого чара
clang умный и всегда видел, что зануленные биты не будут участвовать в инициализации char gcc не такой умный и даже сейчас выдает <source>:6:16: warning: conversion from 'int' to 'char' may change value [-Wconversion] 6 | char b = a & 0xFF;
интересные допущения вы делаете
странно, у меня gcc 11.2 не выдаёт такого варнинга. видимо поумнел
https://godbolt.org/z/4qono5q5W
а, -Wextra
-Wconversion, в диагностике написано
int по определению в стандарте - 4 байта минимум сигнед char - может быть сигнед, а может и ансигнед тоесть говоря "априори попадает в рендж" - это утверждение неверно на одной системе "априори" попадает [0-255] на другой [-127, 128]
не понимаю этот аргумент, ну ладно, раскрою про априори попадает в рендж if (a >= std::numeric_limits<char>::min() && a <= std::numeric_limits<char>::max()) { char c = a; ... }
Это, кстати, не правда. Не менее 16-ти бит в инте должно быть https://eel.is/c++draft/basic.fundamental#4
да, попутал... привык уже к х64 :)
bool sucsess = (char)128 == (char)0; такая конвертация некоректна так как в разных системах ответ разный и понятие "априори попадает" на этапе написания кода не корректно
int v = 128; if (v >= std::numeric_limits<char>::min() && v <= std::numeric_limits<char>::max()) { char n = v; printf("N=%d", n); }
но вообще если хочешь от чаров арифметики, то используй всегда uint8_t/int8_t aka unsigned char/signed char и не ломай голову
разное понимание латинского "априори"... 1. само собой разумеющееся 2. на конкретной системе/машине
https://ru.wikipedia.org/wiki/%D0%90%D0%BF%D1%80%D0%B8%D0%BE%D1%80%D0%B8 Вне философского контекста это выражение часто употребляется как синоним «первоначально» («заранее»);
Тут нет ub
Обсуждают сегодня