免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4290 | 回复: 9
打印 上一主题 下一主题

windows下操作64位无符号数的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-11 18:40 |只看该作者 |倒序浏览
大家帮我看看附件的代码.

在unix下没有问题.

在windows vc60下就有问题,感觉是windows下的"+"符号返回值不能超过32位.

windows是windows xp 32位.cpu是intel双核64位的.

unix是solaris10,64位的.

复件 main.rar

1.77 KB, 下载次数: 64

论坛徽章:
0
2 [报告]
发表于 2007-06-11 20:25 |只看该作者
没人有什么想法吗?

论坛徽章:
0
3 [报告]
发表于 2007-06-11 20:55 |只看该作者
原帖由 SeaKing911 于 2007-6-11 18:40 发表
大家帮我看看附件的代码.

在unix下没有问题.

在windows vc60下就有问题,感觉是windows下的"+"符号返回值不能超过32位.

windows是windows xp 32位.cpu是intel双核64位的.

unix是solaris10,6 ...

建议楼主简化问题,直接把你认为有错或者不理解的代码发出来

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2007-06-11 23:09 |只看该作者
原帖由 zx_wing 于 2007-6-11 20:55 发表

建议楼主简化问题,直接把你认为有错或者不理解的代码发出来

对头,有兴趣从几百行代码中查找一个模糊不清的问题的人估计不多。

另外,建议楼主在请求别人帮你查问题时考虑一下怎么做可以方便(可能)帮你查问题的人,而不是怎么做方便你自己。

论坛徽章:
0
5 [报告]
发表于 2007-06-12 00:48 |只看该作者
llMsg = llMsg + llTmp*( llMsgTmp );

有问题就在这一行.

我之所以把源代码完全的贴出来,就是希望的大家在vc的环境下运行一下,一运行就看出来问题了,没操作一次我就打印一次.

不是想让大家去单纯的看代码.

论坛徽章:
0
6 [报告]
发表于 2007-06-12 19:06 |只看该作者
还是没人帮看看啊。

论坛徽章:
0
7 [报告]
发表于 2007-06-12 21:14 |只看该作者
给自己顶一下。

论坛徽章:
0
8 [报告]
发表于 2007-06-12 21:17 |只看该作者
vc6太老, 换个编译器. 还有你说+号不能超过32位? 建议在加之前先把2个加数转成64位的类型再进行.

论坛徽章:
0
9 [报告]
发表于 2007-06-12 21:25 |只看该作者
+号两边都是64位的无符号数啊,左操作数也是64位的无符号数。

论坛徽章:
0
10 [报告]
发表于 2007-06-13 07:21 |只看该作者
帮你顶一下,我的window XP(Home Edition)中没开发环境,没办法测试,主要用的是linux
int main( int argc, char* argv[] )
{

    char szTmp1[20] = "65c136018f9dea84";

    UINT64 llMsg(0),llMsgTmp(0),llTmp(0); //就只有这里用到UINT64, 前面的100多行,完全跟算法无关,建议发贴时直接改成 unsigned long long

    printf( "sizeofRtn = %d\n", sizeof( llMsg ) );

    memset( szTmp1, 0, 20 );
    strcpy( szTmp1, "65c136028f9dea84" );

    int i = 0, j = 0, k = 0;
    int nRtn = 0; //这个好像没怎么用到, main返回时总是0

    for( i = 19; i >= 0; i-- )
    {
        if( szTmp1[ i ] == 0 )       
            continue;

        if( szTmp1[ i ] >= '0' && szTmp1[ i ] <= '9' )
        {
            llTmp = szTmp1[ i ] - '0';
        }
        else if( szTmp1[ i ] >= 'a' && szTmp1[ i ] <= 'f' )
        {
            llTmp = szTmp1[ i ] - 'a' + 10;
        }
        else if( szTmp1[ i ] >= 'A' && szTmp1[ i ] <= 'F' )
        {
            llTmp = szTmp1[ i ] - 'A' + 10;
        }
        else
        {
            nRtn = -1;
            break;
        }

        if( j == 0 )
        {
            j = i;
            printf( "j = %d\n", j );
        }

        printf( "llTmp = %x\n", llTmp );
        printf( "szTmp1[ i ] = %c\n", szTmp1[ i ] );

        llMsgTmp = 1;
        for( k = 0; k < ( j - i ); k++ )
        {
            llMsgTmp = llMsgTmp * 16;
        }

        llMsg = llMsg + llTmp*( llMsgTmp );

        getchar();

        printf( "llMsg = %016llx\n", llMsg );
        printf( "i = %d\n", i );
    }

    printf( "llMsg = %016llx\n", llMsg );
    printf( "Out i = %d\n", i );


    return 0;

}


下面是我这边运行的结果,没什么问题,不知windows 里面的结果是怎么样的.
建议在VC6中跟踪一下内存,看到底是怎么变化的,问题出在什么地方

sizeofRtn = 8
j = 15
llTmp = 4
szTmp1[ i ] = 4

llMsg = 0000000000000004
i = 15
llTmp = 8
szTmp1[ i ] = 8
llMsg = 0000000000000084
i = 14
llTmp = a
szTmp1[ i ] = a

llMsg = 0000000000000a84
i = 13
llTmp = e
szTmp1[ i ] = e

llMsg = 000000000000ea84
i = 12
llTmp = d
szTmp1[ i ] = d

llMsg = 00000000000dea84
i = 11
llTmp = 9
szTmp1[ i ] = 9

llMsg = 00000000009dea84
i = 10
llTmp = f
szTmp1[ i ] = f

llMsg = 000000000f9dea84
i = 9
llTmp = 8
szTmp1[ i ] = 8

llMsg = 000000008f9dea84
i = 8
llTmp = 2
szTmp1[ i ] = 2

llMsg = 000000028f9dea84
i = 7
llTmp = 0
szTmp1[ i ] = 0

llMsg = 000000028f9dea84
i = 6
llTmp = 6
szTmp1[ i ] = 6

llMsg = 000006028f9dea84
i = 5
llTmp = 3
szTmp1[ i ] = 3

llMsg = 000036028f9dea84
i = 4
llTmp = 1
szTmp1[ i ] = 1

llMsg = 000136028f9dea84
i = 3
llTmp = c
szTmp1[ i ] = c

llMsg = 00c136028f9dea84
i = 2
llTmp = 5
szTmp1[ i ] = 5

llMsg = 05c136028f9dea84
i = 1
llTmp = 6
szTmp1[ i ] = 6

llMsg = 65c136028f9dea84
i = 0
llMsg = 65c136028f9dea84
Out i = -1

[ 本帖最后由 antonym55 于 2007-6-13 09:58 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP