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)<<) | ((unsigned long)(fac)<<) | ((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 ;
}
运行:
[root@localhost:/data/lkchu]# gcc -m64 test.c
[root@localhost:/data/lkchu]# ./a.out
- - ,
--ul: l:
[root@localhost:/data/lkchu]# gcc -m32 test.c
[root@localhost:/data/lkchu]# ./a.out
find error, 0x08
- - ,-
--ul: l:
将代码修改为
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 ;
}
long 与int 比较问题的更多相关文章
- 【NX二次开发】NX内部函数,libufunx.dll文件中的内部函数
本文分为两部分:"带参数的函数"和 "带修饰的函数". 浏览这篇博客前请先阅读: [NX二次开发]NX内部函数,查找内部函数的方法 带参数的函数: void e ...
- 在将 varchar 值 'xinpian' 转换成数据类型 int 时失败?
把int类型的值修改为varchar类型的值
- 把int*传值给char*,打印出错误的数字
首先进入debug模式查看i的地址也就是ptr的值 以16进制位小端模式存储(一个整型四个字节,8位16进制数)(根据系统位数情况) 紧接着因为ptr是char*型指针变量,读取数据时按照一个字节一个 ...
- Convert.ToInt32()、int.Parse()和(int)三者的区别
Convert.ToInt32将object类类型转换成int类型,如Convert.ToInt32(session["shuzi"]); (int)适合简单数据类型之间的转换: ...
- Android View.setId(int id) 用法
Android View.setId(int id) 用法 当要在代码中动态的添加View并且为其设置id时,如果直接用一个int值时,Studio会警告. 经过查询,动态设置id的方法有两种; 1. ...
- 用枚举enum替代int常量
枚举的好处: 1. 类型安全性 2.使用方便性 public class EnumDemo { enum Color{ RED(3),BLUE(5),BLACK(8),YELLOW(13),GREEN ...
- 深度解析C语言int与unsigned int
就如同int a:一样,int 也能被其它的修饰符修饰.除void类型外,基本数据类型之前都可以加各种类型修饰符,类型修饰符有如下四种:1.signed----有符号,可修饰char.int.Int是 ...
- Navicat软件中mysql中int、bigint、smallint和tinyint的区别、布尔类型存储以及乱码问题的解决
很长时间不写博客了,最近一直在忙这学校的比赛都忘记更新博客了.新的任务又要开始了,我们要准备<2017年中国大学生计算机设计大赛软件服务外包竞赛>.这次不能再想像之前那样有PC端的功能作为 ...
- Android LayoutInflater.inflate(int resource, ViewGroup root, boolean attachToRoot)的参数理解
方法inflate(int resource, ViewGroup root, boolean attachToRoot) 中 第一个参数传入布局的资源ID,生成fragment视图,第二个参数是视图 ...
- 使用Guid做主键和int做主键性能比较
使用Guid做主键和int做主键性能比较 在数据库的设计中我们常常用Guid或int来做主键,根据所学的知识一直感觉int做主键效率要高,但没有做仔细的测试无法 说明道理.碰巧今天在数据库的优化过程中 ...
随机推荐
- ThreadLocal介绍
作者:知乎用户链接:https://www.zhihu.com/question/23089780/answer/62097840来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- UIView的多重属性
1)几何属性: 2)位图属性:
- REG小探
根键名称缩写对照表 常用数据类型
- Jmeter实例计划(查询天气)
查询计划(天气查询) 这是一个入门计划,仅使用jmeter进行查询功能的计划,可参考http://www.cnblogs.com/TankXiao/p/4045439.html有代码可下载.不过我还是 ...
- JavaWeb之session应用
session和cookie都是用来存储信息的,区别是session是在服务器端存储信息,而cookie则是在浏览器端存储信息. 通常服务器端存储session,服务器端存储和获取session,一般 ...
- mongodb副本集优先级设置
在设置mongodb副本集时,Primary节点.second节点,仲裁节点,有可能资源配置(CPU或者内存)不均衡,所以要求某些节点不能成为Primary我们知道mongodb的设置: 除了仲裁节 ...
- STM32的备份寄存器和控制状态寄存器
STM32的备份寄存器和控制状态寄存器 1 备份寄存器用于RTC时钟 RTC时钟可以在掉电以后继续计数,保证时间的延续,但是重新上电以后需要配置,保证之前的计数不会被清除,可以借助备份寄存器实现,备份 ...
- Entity Framework中DbContext结合TransactionScope提交事务的正确方式
问: I would like know what is the best possible way to implement transactions with DBContext. In part ...
- sudo命令: 在其他用户下操作root用户权限
一. 场景: 在某个远程服务器 A 上,用 账户1 登陆, 想要在root用户的目录下创建一个 .sh文件, 如果直接 用 touch test.sh 创建,会提示权限不足 此时可以用sudo命令: ...
- phalcon框架与Volt 模块引擎 使用简介
———— 近期工作中web页面使用由C语言编写的Volt模板引擎,相比之前由js动态加载页面速度更快,更利于百度数据的抓取,现根据文档整理一下使用思路 (Volt是一个超快速和设计者友好的模板语言 ...