标题: C51单片机中3600*24和86400有什么区别? [打印本页]

作者: hyjxxy    时间: 2022-4-27 10:02
标题: C51单片机中3600*24和86400有什么区别?
3600*24和86400有什么区别。在C51中用3600*24不能正常显示24小时,用86400就可以。为什么?

作者: 18701931930    时间: 2022-4-27 13:24
3600*24和86400本质上没什么区别,如果你用的86400是一个常量,而3600*24赋值给一个unsigned int 类型的变量,这个区别就大了。
unsigned int 类型的变量存储空间占两个字节(最大值65535) 。你把一个大于65535的数装进这个空间里,明显装不下,肯定会溢出。
不知道你能理解不??

作者: sy10141    时间: 2022-4-27 15:06
51论坛是个好网站,可以下载好多东西,学到了好多
作者: hyjxxy    时间: 2022-4-27 15:12
18701931930 发表于 2022-4-27 13:24
3600*24和86400本质上没什么区别,如果你用的86400是一个常量,而3600*24赋值给一个unsigned int 类型的变 ...

谢谢回复
作者: lzzasd    时间: 2022-4-27 15:55
如果你用的是unsigned long就没问题    都是一样   用的是unsigned int  就溢出了
作者: Hephaestus    时间: 2022-4-27 21:17
c语言编译器常量默认是int型的。不仅3600*24超过了范围,86400也是不对的,我怀疑你实际写的是86400L。
作者: hyjxxy    时间: 2022-4-28 08:46
18701931930 发表于 2022-4-27 13:24
3600*24和86400本质上没什么区别,如果你用的86400是一个常量,而3600*24赋值给一个unsigned int 类型的变 ...

void test(void)
{
       unsigned long mid1,mid2,mid3;
       mid1=6*10000;
       mid2=7*10000;
       mid3=8*10000;
}

调试一下代码就会发现:
mid1=0xea60=60000;
mid2=0x1170=4464;
mid3=0x3880=14464;

mid1是正确的,mid2和mid3是错误的!
作者: 18701931930    时间: 2022-4-29 21:23
hyjxxy 发表于 2022-4-28 08:46
void test(void)
{
       unsigned long mid1,mid2,mid3;

//这样改,把10000修饰为一个long类型的数,系统默认把10000为int类型了。
void test(void)
{
       unsigned long mid1,mid2,mid3;
       mid1=6*10000L;
       mid2=7*10000L;
       mid3=8*10000L;
}




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1