簡體   English   中英

C代碼32到64位類型轉換

[英]C code 32 to 64 bit type conversion

我正在嘗試了解以下代碼中是否有任何東西會導致它在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;
}

我可以對類型轉換進行評論,但是...為什么可以在完全避免它們的情況下考慮代碼中意外的類型轉換? 如果可移植性很重要,則不要使用默認的原始數據類型。 請改用stdint.h。

  • int交換為int32_t
  • long交換int32_t
  • 保持size_t不變,或在需要時將其交換為uint32_t 很有可能沒有。

突然,代碼變成了100%可移植的。

其他的建議:

  • 你為什么要做(void *)malloc(buf_size) void*void*沒有任何意義。
  • 對於托管系統,main()必須始終返回int 15年前,隱式int已從C語言中刪除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM