LINUX.ORG.RU

int to bytes (char*)

 


0

2

Почему буфер L пуст?

size_t bL = 55; 
char L[4];
L[0] = (bL >> 24) & 0xFF;
L[1] = (bL >> 16) & 0xFF;
L[2] = (bL >> 8) & 0xFF;
L[3] = bL & 0xFF;
printf("%x %x %x %x", L[0], L[1], L[2], L[3]); // 0 0 0 37
printf(" strlen(L) = %i\n", strlen(L)); // strlen(L) = 0
Помогите получить char *L с реально заполенными 4-мя символами (байты числа 55).

Почему буфер L пуст?

Потому что функция strlen() натыкается на \0 в первом элементе массива.

Помогите получить char *L с реально заполенными 4-мя символами (байты числа 55).

Используй snprintf(), например.

EXL ★★★★★ ()
Последнее исправление: EXL (всего исправлений: 1)

Кстати, в связи с тем, что в цпп20 знаковый числа - two’s complement, прописали явно поведение при касте в signed:

If the destination type is signed, the value does not change if the source integer can be represented in the destination type. Otherwise the result is the unique value of the destination type equal to the source value modulo 2n where n is the number of bits used to represent the destination type. (since C++20).

раньше было implementation-defined.

pavlick ★★ ()

strlen для массива бинарных данных, серьезно что ли? Всё у тебя по идее верно, просто зачем ты пытаешься получить его длину способом, пригодным лишь для null-terminated строк?

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от invy

const char* L = reinterpret_cast<const char*>(&bL);

это UB.

На cppcon 2019 в докладе про bitcast представитель комитета С++ рассказывал почему это UB во всех С++ включая С++20, и сказал что комитет почти договорился дополнить стандарт чтобы это перестало быть UB в С++ 23.

https://i.imgur.com/seTYGS6.png

Корректное решение без UB на текущий момент:

https://i.imgur.com/VIIVBbi.png

fsb4000 ★★★ ()
Ответ на: комментарий от invy

Без этого все сокет api накроется как и memcpy

Так и есть, в рамках текущего стандарта С++ невозможно реализовать свой memcpy без UB. Об этом тот тип из комитета в видосике и говорил, и поэтому они и правят стандарт, вот с С++23 если всё норм будет, то программист С++ сможет реализовать свой memcpy.

Эта новость, что в компиляторах достаточно магии? Можно открыть любую стандартную библиотеку и посмотреть на количество компиляторных интрисиков. Не вся стандартная библиотека написана на стандартном С++…

fsb4000 ★★★ ()
Ответ на: комментарий от cppsektant

Из забавных последствий этих pointer values:

unsigned u;
(int&)u = -1;

В u теперь хранится значение -1. Не положительное значение, которое сравнимо с -1 по модулю, а именно -1. Читать такой u теперь можно только через lvalue типа int или char, если его диапазон включает отрицательные числа, но не через lvalue типа unsigned/unsigned char.

anonymous ()
Ответ на: комментарий от invy

strict aliasing rules говорят, что у тебя будет UB при доступе через glvalues неправильны типов, но не гарантируют что UB не будет при чтении с правильными типами. «p → q» не эквивалентно «!p → !q».

anonymous ()