long 与int 比较问题
2017-06-02 09:11
190 查看
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
运行:
将代码修改为
在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; }
相关文章推荐
- short int、long、float、double使用问题说明
- 经得起雷劈:关于double和int/long相互转换失去精度计算错误的问题
- java Integer和int之间==的比较问题
- 有关C++ int long最大表示长度问题
- C/C++/JAVA中short,int,long等整型表示范围的比较
- 严肃的问题:在C++(WIN32)中int和long有何区别
- java Integer和int之间==的比较问题 equal
- SSH+Oracle整个问题9 关于BigDecimal 和Int整数比较大小的问题
- short, int, long, long long.长度比较
- int与NSNumber之间的相互转化,以及转化问题对数值比较的影响
- java中Long类型数据必须转化为int才能正确比较
- Integer与int比较的问题
- Java自动装箱解箱问题&&int和Integer类型==比较问题
- long long和int的比较
- short int,int,unsigned int,long,long int,float,double等32位,64位各占几个字节的问题
- long int c = int a * int b的问题
- java Integer和int之间==的比较问题。求解释
- java中Long类型数据必须转化为int才能正确比较
- Java中long类型直接赋值出现The literal xxxxxxxxxx of type int is out of range 问题的原因和解决方法
- 经得起雷劈:关于double和int/long相互转换失去精度计算错误的问题