long 與int 比較問題


long 與int 比較,在32位機器,sizeof都是 占用4個字節;

在window 64位也是占用4個字節

但是在Linux 64位,long占用 8個字節, int占用4個字節,這樣比較就會有問題。 當int 強轉 位long時,發生 int高位1(符號位1)轉為long的高位1(補全) 出現大的值。

譬如:     int 0x80650008 (-2140864504) 高位1,是一個負值,

    強轉位long 0xFFFFFFFF80650008 (-2140864504) , 這樣就出現問題了。

 

下面這段代碼TTSAPIERROR 實際上是32位,那么只需要比較32位即可,可以將long 強轉為int

#include "stdio.h"

#ifndef SCODE
#define SCODE long
#endif

#ifndef MAKE_SCODE
#define MAKE_SCODE(sev,fac,code) \
        ((SCODE) (((unsigned long)(sev)<<31) | ((unsigned long)(fac)<<16) | ((unsigned long)(code))) )
#endif

#define FACILITY_TTSAPI   (0x65)
#define SEVERITY_ERROR      1
#define TTSAPIERROR(x)    MAKE_SCODE(SEVERITY_ERROR,   FACILITY_TTSAPI, (x & 0x0000FFFF))

int main()
{

    //error code  
    int ret = TTSAPIERROR(0x08);
    long ret2 = (long)ret;

    if(ret2 == TTSAPIERROR(0x08))
    {   
        printf("find error, 0x08 \n");
    }   
    
    //show
    printf("%d %ld ,%ld \n", ret, ret2, TTSAPIERROR(0x08));

    printf("--ul:%d  l:%d \n",sizeof(unsigned long), sizeof(long));
    return 0;
}

運行:

[root@localhost:/data/lkchu]# gcc -m64 test.c
[root@localhost:/data/lkchu]# ./a.out 
-2140864504 -2140864504 ,2154102792 
--ul:8  l:8 
[root@localhost:/data/lkchu]# gcc -m32 test.c
[root@localhost:/data/lkchu]# ./a.out 
find error, 0x08 
-2140864504 -2140864504 ,-2140864504 
--ul:4  l:4 

 

將代碼修改為

int main()
{

    //error code  
    int ret = TTSAPIERROR(0x08);
    long ret2 = (long)ret;

    if(ret == (int)TTSAPIERROR(0x08))
    {   
        printf("find error, 0x08 \n");
    }   
    
    //show
    printf("%d %ld ,%ld \n", ret, ret2, TTSAPIERROR(0x08));

    printf("--ul:%d  l:%d \n",sizeof(unsigned long), sizeof(long));
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM