C/C++ Как в памяти хранится long long?

Решил тут с побитовыми побаловаться. Так вот: захотелось вывести все биты целого, но не делением, а побитами.

string s="";
    int x = 67542;
    for(int i=sizeof(int)*8-1; i>=0; i--)
       s += ((x&1<<i) ? '1' : '0');
    cout << s;

С int всё работает очень хорошо. Выводит 00000000000000010000011111010110 А вот что-то не так с long long(signed/unsigned). Выводит 0000000000000001000001111101011000000000000000010000011111010110 Вроде как повторяет число дважды. По идее должно выводить спереди кучу нулей.

string s="";
    long long unsigned x = 67542;
    for(int i=sizeof(long long unsigned)*8-1; i>=0; i--)
       s += ((x&1<<i) ? '1' : '0');
    cout << s;

Главный вопрос: почему так происходит?


Ответы (2 шт):

Автор решения: Harry

Вот здесь

(x&1<<i)

компилятор считает, что 1 у вас - это int. А должен быть unsigned long long, иначе просто будет UB при больших i.

(x&1ull<<i)

Попробуйте так...

→ Ссылка
Автор решения: megorit

Code:

std::uint64_t number = 0xFFFFFFFF;
for (int shift = 63; shift >= 0; --shift)
    std::cout << ((number >> shift) & 1);

Output:

0000000000000000000000000000000011111111111111111111111111111111

Template:

template<typename T>
concept Integral = std::is_integral_v<T>;

template<Integral T>
void binrep(const T number)
{
    for (int shift = sizeof(T) * 8 - 1; shift >= 0; --shift)
        std::clog << ((number >> shift) & 1);
    std::clog << std::endl;
}
→ Ссылка