LINUX.ORG.RU

Есть 2 32-битных счётчика. Как кросс-платформенно их запихать в 64-битное число?

 


0

3

Хочется менять 2 32-битных счётчика, но сохранять их в одном 64-битном числе.Как в C++ коде оформить такую штуку, чтобы это не зависело от endianness?

Это кросс-эндианно?

// счётчики
uint32_t a = 18;
uint32_t b = 77;

// упаковка
uint64_t p = ((uint64_t)a << 32) | b;

// распаковка
uint32_t aaa = p >> 32;
uint32_t bbb = p & 0xffffffff;

В принципе могу заюзать структуру

struct Value {
    uint32_t a;
    uint32_t b;
};
Но не уверен, что она не займёт более 64 бит. Если сохраню её невыровненно, то после a компилер добавит padding?



Последнее исправление: hlamotron (всего исправлений: 2)

Это кросс-эндианно?

Что значит кросс-эндианно? Endianess применимо к бинарному представлению данных - в коде ты его никак не касаешься, никакого endianess у тебя там нет, код будет работать везде одинаково (только a нужно кастовать к uint64_t перед сдвигом). А вот если ты собрался свой uint64_t передавать по сети или хранить на диске, разумеется никакой переносимости у тебя не будет.

slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 3)

Что именно у тебя не должно зависеть от endianness? Ты это число собираешься передавать на другую архитектуру и там с ним работать? Тогда беспокойся об endianness uint32_t в первую очередь. http://www.boost.org/doc/libs/1_62_0/libs/endian/doc/index.html тебе в помощь.

asaw ★★★★★
()

если передавать по сети, то всегда желательно использовать htons и наоборот. если ты просто про компиляцию для разных платформ, то только дефайнами и/или анализом платформы (#ifdef X86 ... #else ...)

taker
()

Это кросс-эндианно?

Да.

Если сохраню её невыровненно, то после a компилер добавит padding?

А если ты сохранишь int64_t невыровнено, а потом компилер добавит padding?

Esper
()

std::pair<uint32_t, uint32_t>, байтоложество не нужно. /thread

Softwayer ★★
()

В принципе могу заюзать структуру

Можно еще заюзать массив из двух uint32_t

SZT ★★★★★
()

Какой смысл вкладывается в понятие «кросс-эндианно»? Зачем это вообще надо? Ты это собираешься передавать по сети? Тебе важно, какой конкретно uint32_t займет старшую половину uint64_t, а какой младшую?

Распаковывать-упаковывать можно тупо через memcpy, и это может оказаться быстрее, чем эти маски-сдвиги.

SZT ★★★★★
()

Низнаю как в плюсах, а на Си можно так, нопремер:

typedef union {
    struct {
        #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
            uint32_t l,h;
        #else
            uint32_t h,l;
        #endif
    };
    uint64_t x;
} myunion;

void main() {
    myunion u;
    u.l = 0x11;
    u.h = 0xff;
    printf("%016lx\n", u.x);
}
anonymous
()
Ответ на: комментарий от i36_zubov

заведи сразу 64битную переменную и инлайнфункции для доступа к 32битным её частям

Так и сделал. Но какой же я тупой, если можно было заюзать union!

hlamotron
() автор топика
Ответ на: комментарий от SZT

Да, я уже понял что я тупой школоло. Эндианность - это про layout в памяти, а не про представление длинных чисел в проце.

hlamotron
() автор топика
Ответ на: комментарий от hlamotron

забыл про union
c++

ты только не забывай, что в Си это работает, а в с++, хоть g++ и гарантирует работу, это UB по стандарту.

anonymous
()
Ответ на: комментарий от i36_zubov

Дело не в спасении от bigendian, а в повышенном удобстве манипуляции 64-битным полем через 2 отдельных именованных поля.

hlamotron
() автор топика

1) Это кросс-эндианно?

Да.

2) В принципе могу заюзать структуру

Не надо.

Если хочется, то можно сделать ее packed, и даже поставить где-то условие, что ее размер должен быть ровно 8 байт.

UPD. Хотя так, наверно, быстрее будет работать, чем со сдвигами.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от hlamotron

До тех пор, пока оптимизатор не выкинет UB.

anonymous
()
Ответ на: комментарий от hlamotron

Какой же я тупой дебил,забыл про union и трахаю себе моск со сдвигами.

Нет. Трахать себе моск - это:

#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__

Сдвиг - это значительно более простой и вменяемый способ сделать то, что тебе надо.

Esper
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.