有效地结合两个32位? - C

时间:2010-07-29 09:19:38

标签: c

我有一个函数,它需要一个8字节长的unsigned char。

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 个答案:

答案 0 :(得分:3)

你可以把它们放在一个数组中:

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

编辑:使用现有变量:

unsigned long int lohi[2] = {lo, hi};

答案 1 :(得分:3)

工会是否可以移植?如果是这样,这是一个很好的方法......

union {
    struct {
        unsigned char CharArray[8];
    } ub;
    struct {
        unsigned long int IntArray[2];
    } ul;
    unsigned long long ull;
} Foo;

答案 2 :(得分:2)

Typecast,bitshift并按位或。

unsigned long int low = 1;
unsigned long int high = 0;
unsigned long long ull = (unsigned long long) high << 32 | low;

答案 3 :(得分:0)

您可以使用union和struct的组合来保留您的namings而不使用数组。

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

像往常一样使用lowhigh,并在致电ull时使用f1。但请注意,以这种方式编写它,你会假设一个小端序。

另请注意,在Linux和其他UNIX上,在64位模式下,long intlong long int都是64位(只有int是32位)。 据我所知,只有Windows在64位模式下有long int为32位。

答案 4 :(得分:0)

看待它的不同方式:

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 ++中可以更好地工作。