char — c ++ (OpenBSD 5.8 amd64) с выводом uint64_t в виде действительного числа

Пытаясь понять, почему я получаю следующий вывод из моей программы:

$ ./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

0

Решение

Написание одного члена союза и чтение другого неопределенное поведение (за исключением, но в данном случае это UB).

Ты не должен ожидать что-нибудь. Компилятор может сделать WTF, который он хочет, с вашим кодом, например, дать хороший «ожидаемый» результат в режиме отладки и мусора или сбоя в режиме выпуска. Конечно, другой компилятор может сыграть другую хитрость. Вы никогда не узнаете наверняка, так зачем?

Почему бы не сделать это правильно? memcpy возможно?

РЕДАКТИРОВАТЬ:

к действительно ответьте на вопрос, записку о std::cout : std::hex устанавливает поток в шестнадцатеричное представление, поэтому последнее отображение «uint64 val:» находится в шестнадцатеричной основе (а не в десятичной, как ожидает OP). Кроме этого, ничего плохого в выходе, несмотря на угрозу UB.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]