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做主键效率要高,但没有做仔细的测试无法 说明道理.碰巧今天在数据库的优化过程中 ...
随机推荐
- PowerDNS简单教程(1):安装篇
这一篇开始直接是PowerDNS教程,连续四篇.DNS的相关背景知识我就不介绍了,有需要的话看看 http://baike.baidu.com/link?url=QcthFpAb2QydMqcMJr9 ...
- 6.spring:AOP(注解)
spring Aop AOP面向切面编程,与OOP面向对象编程相辅相成 AOP中最基本的单元是切面 问题: 代码混乱:越来越多的业务需求(日志&验证)加入后,原有的业务方法急剧膨胀,每个方法 ...
- Crontab 学习
分钟 小时 日期 月份 星期几 整点执行 0 8-22 * * * /usr/bin/php /home/anbaojia/wwwroot/shjn/yii report/sync 查看 cron 执 ...
- 图片验证码——base64编码的使用
一.介绍: 1.base64编码简介: Base64就是一种编码格式.Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成 ...
- Cesium.js点击事件
创建viewer var viewer = new Cesium.Viewer('cesiumContainer'); 鼠标事件 var handler = new Cesium.ScreenSpac ...
- Entity Freamwork CodeFirst 连接PostgreSql数据库
EF的Code First是一个比较强大也比较有用的功能,他可以让你先写代码,最后根据代码去生成数据库,非常符合OO设计的要求,抛开数据库层面不管(当然不是完全的不管),只管对象的设计. 首先,说一下 ...
- 数据库——MySQL——索引——索引原理及B+树
索引原理 我们使用索引,就是为了提高查询的效率,如同查书一样,先找到章,再找到章中对于的小节,再找到具体的页码,再到我们需要的内容. 事实上索引的本质就是不断缩小获取数据的筛选范围,找出我们想要的结果 ...
- linuxc - entos 7.3 开放端口并对外开放
1. 查看已打开的端口 # netstat -anp 2. 查看想开的端口是否已开 # firewall-cmd --query-port=666/tcp 若此提示 FirewallD is not ...
- #leetcode刷题之路8-字符串转换整数 (atoi)
请你来实现一个 atoi 函数,使其能将字符串转换成整数.首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止.当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面 ...
- Linux面试笔试题带答案【详解】
一.填空题:1. 在Linux系统中,以 ,该文件属性是 目录.8. 前台起动的进程使用 Ctrl+c 终止.9. 静态路由设定后,若网络拓扑结构发生变化,需由系统管理员修改路由的设置.10. 网络管 ...