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

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

50 ответов

17 просмотров

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 Вне философского контекста это выражение часто употребляется как синоним «первоначально» («заранее»);

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта