Пытаясь понять, почему я получаю следующий вывод из моей программы:
$ ./chartouintest
UInts: 153 97 67 49 139 0 3 129
Hexes: 99 61 43 31 8b 00 03 81
uint64 val: 8103008b31436199
$
Я пытаюсь вывести только фактическое числовое значение UInt64, но, похоже, не могу этого сделать (вывод неправильный)
вот код:
#include <iostream>
#include <iomanip>
#include <stdlib.h>
union bytes {
unsigned char c[8];
uint64_t l;
} memobj;
int main() {
//fill with random bytes
for(unsigned int i=0; i < sizeof(memobj.c); ++i) { memobj.c[i] = (unsigned char)rand();}
//see values of all elements as unsigned int8's and hex vals
std::cout << "UInts: ";
for (int x=0; x < sizeof(memobj.c); ++x) { std::cout << (unsigned int)memobj.c[x] << " "; }
std::cout << std::endl;
std::cout << "Hexes: ";
for (int x=0; x < sizeof(memobj.c); ++x) { std::cout << std::setw(2) << std::setfill('0') << std::hex << (unsigned int)memobj.c[x] << " "; }
std::cout << std::endl;
std::cout << "uint64 val: " << memobj.l << std::endl;
}
Что я делаю неправильно???
Заранее спасибо за помощь!
J
Написание одного члена союза и чтение другого неопределенное поведение (за исключением, но в данном случае это UB).
Ты не должен ожидать что-нибудь. Компилятор может сделать WTF, который он хочет, с вашим кодом, например, дать хороший «ожидаемый» результат в режиме отладки и мусора или сбоя в режиме выпуска. Конечно, другой компилятор может сыграть другую хитрость. Вы никогда не узнаете наверняка, так зачем?
Почему бы не сделать это правильно? memcpy
возможно?
РЕДАКТИРОВАТЬ:
к действительно ответьте на вопрос, записку о std::cout
: std::hex
устанавливает поток в шестнадцатеричное представление, поэтому последнее отображение «uint64 val:» находится в шестнадцатеричной основе (а не в десятичной, как ожидает OP). Кроме этого, ничего плохого в выходе, несмотря на угрозу UB.
Других решений пока нет …