游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3767|回复: 11

关于溢出的处理问题

[复制链接]

13

主题

31

帖子

46

积分

注册会员

Rank: 2

积分
46
发表于 2006-7-10 20:47:00 | 显示全部楼层 |阅读模式
有个服务器端函数 DWORD dwlogintime = GetTickCount()   要实现dw1和dw2的先后判断,但DWORD类型大概在50天左右就会溢出了,怎么处理才能让它不用重启服务器又能准确判断呢

10

主题

95

帖子

95

积分

注册会员

Rank: 2

积分
95
QQ
发表于 2006-7-10 22:00:00 | 显示全部楼层

Re:关于溢出的处理问题

long long?

30

主题

422

帖子

433

积分

中级会员

Rank: 3Rank: 3

积分
433
发表于 2006-7-10 22:55:00 | 显示全部楼层

Re:关于溢出的处理问题

2个时间的差是可以判断的。

22

主题

274

帖子

274

积分

中级会员

Rank: 3Rank: 3

积分
274
发表于 2006-7-10 22:58:00 | 显示全部楼层

Re:关于溢出的处理问题

再加个DWORD,溢出一次就加一,等于数字表示为( DWORD, DWORD ),末位满了就往前进1,那不就等于64位数了.这样应该可以吧.

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20737
发表于 2006-7-11 00:06:00 | 显示全部楼层

Re:关于溢出的处理问题

50天重启一次服务器还不够本?

能坚持30天重启一次的服务器我觉得就相当牛了。

4

主题

118

帖子

119

积分

注册会员

Rank: 2

积分
119
发表于 2006-7-11 09:31:00 | 显示全部楼层

Re:关于溢出的处理问题

不用考虑这个问题了,没有什么实际意义,没有什么游戏服务器需要你连续30天以上不关机

3

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2006-7-11 10:03:00 | 显示全部楼层

time()

既然你希望能够运行50天以上,那么对时间的精度显然没有那么高的要求。那么你只要使用time()函数就可以了。这个函数从1975年开始计时,可以运行147年不溢出,单位是秒。应该够用了。
这个函数包含在mmsystem.h里,winmm.lib。

18

主题

971

帖子

982

积分

高级会员

Rank: 4

积分
982
发表于 2006-7-11 23:11:00 | 显示全部楼层

Re:关于溢出的处理问题

50天...现在还没听说过有超过30天不关机的的服务器吧....你要计算多久?100年?在vc下unsigned __int64 在unix下面仿佛是 u_int64.....要不自己写个数据类型得了,封个256bit的数字,怎么计时都行.

14

主题

118

帖子

118

积分

注册会员

Rank: 2

积分
118
发表于 2006-7-11 23:26:00 | 显示全部楼层

Re: 关于溢出的处理问题

直接想到的就是把位数换成 64 位的。
再做溢出进位判断。

unsigned __int64 NewGetTickCount()
{

        struct SLONG
        {
                unsigned long dwLower;
                unsigned long dwUpper;
        };
        union SO_LONG
        {
                SLONG   value1;
                __int64 value2;
        };

        static SO_LONG new_value = {0};
        static unsigned long old_value = {0};

        new_value.value1.dwLower = GetTickCount();
        if (new_value.value1.dwLower < old_value)
        {
                ++new_value.value1.dwUpper;
        }
        old_value = new_value.value1.dwLower;

        return new_value.value2;
}

14

主题

118

帖子

118

积分

注册会员

Rank: 2

积分
118
发表于 2006-7-11 23:30:00 | 显示全部楼层

Re:关于溢出的处理问题

unsigned __int64 NewGetTickCount()
{

        struct SLONG
        {
                unsigned long dwLower;
                unsigned long dwUpper;
        };
        union SO_LONG
        {
                SLONG   value1;
                __int64 value2;
        };

        static SO_LONG value = {0};
        unsigned long new_value = {0};

        new_value = GetTickCount();
        if (new_value < value.value1.dwLower)
        {
                ++new_value.value1.dwUpper;
        }
        value.value1.dwLower = new_value;

        return value.value2;
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 11:32

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表