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;
}