170 похожих чатов

Можно переменную int преобразовать в char?

50 ответов

16 просмотров

char charvar{static_cast<char>(intvar)};

гадалка подсказала: int x = 8; char c = '0' + x;

Nelson- Автор вопроса

int a = calc_a(); char b = a & 0xFF

Stas
int a = calc_a(); char b = a & 0xFF

Красивый пример уб...

Stas
где?

Чтение неинициализированной переменной

Liber Azerate
Чтение неинициализированной переменной

ну я сократил пример) очевидно, там есть где-то инициализация

Stas
int a = calc_a(); char b = a & 0xFF

Я бы на месте компиля ворнинг выдал...

Stas
int a = calc_a(); char b = a & 0xFF

некорректно. char это в основном (у меня) = signed char тоесть с отрицательными все плохо в этом примере

Stas
поправил

Не за отсутствие инициализации ворнинг :)

Stas
в чём некорректность?

signed-unsigned преобразования

Stas
в чём некорректность?

```int a = -1; char your_char = a&0xFF; // your_char == 0xFF here

Stas
ну это не UB

Епрст. Я же не говорю, что UB😊

Dmitriy [Отпуск]
signed-unsigned преобразования

даже с -funsigned-char тут нет проблемы

N
некорректно. char это в основном (у меня) = signed...

На это нельзя полагаться. Пиши явно.

N
```int a = -1; char your_char = a&0xFF; // your_ch...

your_char будет равно -1. а unsigned char == 255

N
```int a = -1; char your_char = a&0xFF; // your_ch...

конкретно тут неочень пример... тут как рас верно )) но.. с отрицательными значекниями меньше чем -128 все плохо

N
конкретно тут неочень пример... тут как рас верно ...

ну не то, что плохо. вполне ожидаемо )

Dmitriy [Отпуск]
signed-unsigned преобразования

а за сужающее преобразование не?

Vlad
а за сужающее преобразование не?

а его тут нет. ни g++, ни clang не выдают варнинга

Stas
а его тут нет. ни g++, ни clang не выдают варнинга

то, что не выдают, еще не значит, что его нет

Vlad
то, что не выдают, еще не значит, что его нет

если его не выдают, то его действительно нет :)

Stas
если его не выдают, то его действительно нет :)

static_assert(std::is_same_v<int, decltype(int{} & 0xFF)>); это компилируется, если что

Vlad
то, что не выдают, еще не значит, что его нет

вот можете привести кейс, в котором данное преобразование будет некорректным? считаем, что значение инта априори попадает во множество конвертируемого чара

Stas
а его тут нет. ни g++, ни clang не выдают варнинга

clang умный и всегда видел, что зануленные биты не будут участвовать в инициализации char gcc не такой умный и даже сейчас выдает <source>:6:16: warning: conversion from 'int' to 'char' may change value [-Wconversion] 6 | char b = a & 0xFF;

Vlad
clang умный и всегда видел, что зануленные биты не...

странно, у меня gcc 11.2 не выдаёт такого варнинга. видимо поумнел

Stas
а, -Wextra

-Wconversion, в диагностике написано

N
могу.

int по определению в стандарте - 4 байта минимум сигнед char - может быть сигнед, а может и ансигнед тоесть говоря "априори попадает в рендж" - это утверждение неверно на одной системе "априори" попадает [0-255] на другой [-127, 128]

N
int по определению в стандарте - 4 байта минимум с...

не понимаю этот аргумент, ну ладно, раскрою про априори попадает в рендж if (a >= std::numeric_limits<char>::min() && a <= std::numeric_limits<char>::max()) { char c = a; ... }

N
int по определению в стандарте - 4 байта минимум с...

Это, кстати, не правда. Не менее 16-ти бит в инте должно быть https://eel.is/c++draft/basic.fundamental#4

Stas
не понимаю этот аргумент, ну ладно, раскрою про ап...

bool sucsess = (char)128 == (char)0; такая конвертация некоректна так как в разных системах ответ разный и понятие "априори попадает" на этапе написания кода не корректно

N
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); }

N
bool sucsess = (char)128 == (char)0; такая конверт...

но вообще если хочешь от чаров арифметики, то используй всегда uint8_t/int8_t aka unsigned char/signed char и не ломай голову

Stas
int v = 128; if (v >= std::numeric_limits<char...

разное понимание латинского "априори"... 1. само собой разумеющееся 2. на конкретной системе/машине

N
разное понимание латинского "априори"... 1. само ...

https://ru.wikipedia.org/wiki/%D0%90%D0%BF%D1%80%D0%B8%D0%BE%D1%80%D0%B8 Вне философского контекста это выражение часто употребляется как синоним «первоначально» («заранее»);

Похожие вопросы

Обсуждают сегодня

Мужики и девушки, привет) в Вelphi xe7 в настройках во вкладке "Editor Options" далее " Color" есть список: "Elements", открыв который мы можем настраивать отображение разных...
Kraszx
14
Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
А вот это что за конструкция? Вернее, она тут нафига?
Serjone
10
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
Мужики. привет) в Вelphi xe7 в настройках во вкладке "Editor Options" далее " Color" есть список: "Elements", открыв который мы можем настраивать отображение разных элементов...
Kraszx
2
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Товарищи, кто работа с iphelper? Или может я в самой логике ошибки фигачу, не пойму.... var ifTable : PMIB_IFTABLE; size, corSize: DWORD; Buffer ...
Warfarellen
4
я так понимаю, я так подозреваю, что создание такого плагина для человека, кто умеет писать плагины для делфи потребует минут 5-10 времени. но это мое подозрение. хотелось бы ...
Kraszx
7
Всем привет! Кто пользуется DevExpress, подскажите пожалуйста, реализован ли в TcxGrid в новых версиях поиск по датам как в Экселе (ну т.е. не просто список чекбоксов со значе...
A Z
4
Карта сайта