C代码32到64位类型转换

时间:2014-03-20 14:47:20

标签: c types casting 64-bit porting

民间 我试图了解下面的代码中是否有任何东西会导致它在64位平台上失败。我主要担心的是是否发生了一些不适合64位的类型转换。不要过分关注分配给变量的实际数字,因为我为这个例子编写了它们。我主要担心的是long and int and size_t与您可能看到的任何其他问题之间发生的类型转换问题。

#define NL_AREA 40      
#define NS_AREA 38     
#define NB_EXTRA (1536 - NS_AREA * NL_AREA) 

main()
{
    long int  bufsize;
    int       obssize, nelm, nbuf;
    int ncol, ndet = 10;
    void      *result;

    obssize = xxx; /* some size */
    bufsize = (long)obssize * (NL_AREA * NS_AREA + NB_EXTRA);
    ncol = 50;
    nbuf = ncol * ndet;
    nelm = 1;
    result = Buf_Init(bufsize, nelm, nbuf);
}

void * 
Buf_Init( size_t elm_size, 
          int    nelm_buf, 
          long   nbuf )
{
    long buf_size;
    void *p;
    buf_size = ((long) elm_size) * nelm_buf;
    if ((p = (void *)malloc(buf_size)) == NULL)
      return NULL;
    else
      return p;
}

1 个答案:

答案 0 :(得分:1)

我可以对类型转换发表评论,但是......为什么要考虑代码中的意外类型转换,以便完全避免它们?如果可移植性很重要,则不要使用默认的原始数据类型。请改用stdint.h。

  • int交换int32_t
  • long交换int32_t
  • 保持size_t不变,或者将其换成uint32_t以防万一。很可能它没有。

突然,代码变得100%便携了。

其他评论:

  • 你为什么要(void *)malloc(buf_size)?从void*投射到void*没有任何意义。
  • 对于托管系统,main()必须始终返回int。 15年前,隐式int已从C语言中删除。