Можно переинтерпретировать память как unsigned int, а там уже никакого дополнительного кода нет и 11111111111111111111111111111110 будет 4294967294, а 11111111111111111111111111111101 - 4294967293.
#include <iostream>
#include <cstring>
int main() {
int x = -2;
unsigned int y = 0;
memcpy(&y, &x, sizeof(y));
std::cout << y;
return 0;
}
Еще можно делать извращение вроде
std::cout << *(unsigned int*)(&x), но не стоит.
В случае обращения к int через указатель на unsigned int это еще нормально, но вообще говоря, это исключение. Обычно нельзя обращаться к переменной одного типа через указатель другого типа. Это неопределенное поведение. Таким вот образом посмотреть на расположение битов в float через преобразование к int нельзя.
Копирование же в переменную другого типа но такого же размера через memcpy - сработает всегда. При этом компилятор копирование убирает при оптимизации, так что правильное решение работат также быстро, как с Undefined Behavior.
Примерно также можно определить и порядок байт в числе, надо будет копировать в массив из байт и выводить уже побайтово.