long 与int 比较问题

Posted 偏爱省略号

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

运行:

[[email protected]:/data/lkchu]# gcc -m64 test.c
[[email protected]:/data/lkchu]# ./a.out 
-2140864504 -2140864504 ,2154102792 
--ul:8  l:8 
[[email protected]:/data/lkchu]# gcc -m32 test.c
[[email protected]:/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;
}

 

以上是关于long 与int 比较问题的主要内容,如果未能解决你的问题,请参考以下文章

java中 Long类型能直接和int类型比较大小了?

PAT 数列的片段和简单数论

java long型计算问题

为啥我的 C 代码片段不起作用?简化版可以。为 unsigned long long 传递不带 VA_ARGS 的 args

经典面试题:Integer类型 ==比较问题

bigdecimal 与long int 之间转换