首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

请教 宏定义结果溢出的问题!

请教 宏定义结果溢出的问题!

 #define sec  (60*60*34*365 )    // 一年中的秒数


 这个宏如果这样定义的化是错的,那该怎么定义这个宏那?

你这应该不是要定义“宏”,而是要定义一个常量。
海纳百川  有容乃大
定义常量是没错的,不过这是一道C语言的测试题目

原来是这样定义的 #define sec (60*60*24*365)ul , 我想把这种用法移植一下,可是不知道 在 codewoarrior 中该怎么写。 我感觉这种写法比直接写一个常数可读性要好。

不知道那位高人知道这条语句该怎么写?

可以强制类型转换嘛

可以强制类型转换嘛,比如
#define (unsigned long)(*****)

 边凿磨边用
 
 经验同分享
呵呵,这种写法已经试过了, 定义的时候没问题,
引用的时候会报错的。
long sum
...
sum=sec

那时定义的问题,还是引用的问题???

上面的没有说清楚

是引用的结果不对,比如强制类型转换后

sum 应该是 xxxxxxxx 9位数 可是实际的结果却是 xxxxxx 6位数 , 高3位被舍掉了,
低6位是对的。

在宏定义里面不要用运算

直接用31536000代替60*60*24*365

#define sec(ul)  (unsigned long)(31536000*ul)

unsigned long sum;

sum=sec(2);

看看CW有没有把long设置成32bit,这样能得到正确结果

[此贴子已经被作者于2006-2-17 10:27:16编辑过]

直接用数值代替运算 当然是可以的,我试过了,没有问题的。

问题是,用运算比用数值直观,并也容易修改,而且也起到了注释的作用。 把运算交给编译器去处理对实际运行的程序没有任何影响的。

所以说,如果用运算来表示这个宏的话,那改怎么写? 或者 CW要改某一项设置吗?

直接用数值表示宏的话,就没有讨论的意义了。

返回列表