Объединить два 32-битных эффективно?- С - PullRequest
0 голосов
/ 29 июля 2010

У меня есть функция, которая ожидает 8-байтовый символ без знака.

void f1(unsigned char *octets)
{
  unsigned char i;
  for (i=0;i<8;i++)
    printf("(%d)",octets[i]);
}

Вот как я использую его, пока у меня есть одно 64-битное целое число:

  unsigned long long ull = 1;
  f1((unsigned char *) &ull);

(в нем используется собственный порядковый номер машины.)

У меня вопрос: если вместо целого числа 1x64bit у меня есть целые числа 2x32bit, есть ли способ эффективно объединить их как входные данные для этой конкретной функции?

  unsigned long int low = 1;
  unsigned long int high = 0;

Ответы [ 5 ]

3 голосов
/ 29 июля 2010

Объединение работает переносимо?Если так, то это хороший подход ...

union {
    struct {
        unsigned char CharArray[8];
    } ub;
    struct {
        unsigned long int IntArray[2];
    } ul;
    unsigned long long ull;
} Foo;
3 голосов
/ 29 июля 2010

Вы можете просто поместить их в массив:

unsigned long int lohi[2] = {1, 0};
f1((unsigned char *) lohi);

edit : Использование существующих переменных:

unsigned long int lohi[2] = {lo, hi};
2 голосов
/ 29 июля 2010

Тип, бит и сдвиг по битам или.

unsigned long int low = 1;
unsigned long int high = 0;
unsigned long long ull = (unsigned long long) high << 32 | low;
0 голосов
/ 29 июля 2010

Другой взгляд на это:

void f1( unsigned char* octet )
{
    f2( octet, octet + 4 );
}

void f2( unsigned char* quad1, unsigned char *quad2 )
{
    unsigned char i;
    for (i=0;i<4;i++)
        printf("(%d)",quad1[i]);
    for (i=0;i<4;i++)
        printf("(%d)",quad2[i]);
}

Лучше работает в C ++, когда обе функции могут иметь одинаковые имена.

0 голосов
/ 29 июля 2010

Вы можете использовать комбинацию union и struct для сохранения своих имен и без использования массивов.

union {
    struct {
        unsigned long int   low  = 0;
        unsigned long int   high = 1;
    };
    unsigned long long int  ull;
};

Используйте low и high, как вы это делаете, и используйте ull при вызовеf1.Но обратите внимание, что если вы пишете это таким образом, вы предполагаете немного порядковый порядок.

Также обратите внимание, что в Linux и других UNIX в 64-битном режиме и long int, и long long int являются 64-битными (только int составляет 32 бита). Из того, что я знаю, только Windows имеет long int как 32 бита в режиме 64 бита.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...