[英]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
。 uint32_t
。 很有可能沒有。 突然,代碼變成了100%可移植的。
其他的建議:
(void *)malloc(buf_size)
? 從void*
為void*
沒有任何意義。 int
。 15年前,隱式int已從C語言中刪除。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.