feiniao007@ 发表于 2013-11-22 11:42:24

keil MDK 计算64位整型出错!

LPC1765程序大致如下:
unsigned long long a,b;//64bit
unsigned long c,d;    //32bit
c=10000ul;   d=20000ul;
a=(unsigned long long)c*c;
b=(unsigned long long)d*d;
printf("a=%llu,b=%llu\r\n",a,b);   
输出后值时错误的,有时只取到高32bit,或将计算的低32bit放到了高32bit。貌似内存重叠,
将printf("a=%llu,b=%llu\r\n",a,b);
改成printf("a=%llu,b=%llu\r\n",(unsigned long long)a,(unsigned long long)b); 也不对!
不知怎么才能计算正确。看keil帮助文档,说支持64bit整型。
在VC里验证,将long long改成__int64,%llu改成%I64u,结果是对的,说明VC直接运算是没有错误的。

版本信息:

IDE-Version:
μVision V4.03
Copyright (c) Keil Elektronik GmbH / Keil Software, Inc. 1995 - 2009
Tool Version Numbers:
Toolchain:      RealView MDK-ARMVersion: 4.10
Toolchain Path:    BIN40\
C Compiler:         Armcc.Exe       V4.0.0.728
Assembler:          Armasm.Exe       V4.0.0.728
Linker/Locator:   ArmLink.Exe       V4.0.0.728
Librarian:             ArmAr.Exe       V4.0.0.728
Hex Converter:      FromElf.Exe       V4.0.0.728
CPU DLL:               SARMCM3.DLL       V4.10
Dialog DLL:         DARMP1.DLL       V1.13
Target DLL:         ..\TKScope\UL2ARM_TKSCP_DRV_ARM_for_AGDI.dll
Dialog DLL:         TARMP1.DLL       V1.13

qlb1234 发表于 2013-11-22 12:17:08

a=(unsigned long long)c*(unsigned long long)c;
b=(unsigned long long)d*(unsigned long long)d;這樣呢?

feiniao007@ 发表于 2013-11-22 12:44:54

qlb1234 发表于 2013-11-22 12:17 static/image/common/back.gif
這樣呢?

不行啊,我感觉是哪里的宏定义限制了编译范围

Cliff 发表于 2013-11-22 13:12:10

我看上去问题是在printf库的实现。
你看看有没有相关选项?用完整版的printf。

y574924080 发表于 2013-11-22 11:42:25

先确认是a,b的值不对,还是printf的问题吧

我简单测试一下:
用keil/ARM/Examples/Hello/Hello.uvproj的工程,测试没有问题

feiniao007@ 发表于 2013-11-22 13:54:35

y574924080 发表于 2013-11-22 13:19 static/image/common/back.gif
先确认是a,b的值不对,还是printf的问题吧

我简单测试一下:


工程用的是周立功的模板,是从ADS搬过来的,有影响没。

feiniao007@ 发表于 2013-11-22 14:14:13

y574924080 发表于 2013-11-22 13:19 static/image/common/back.gif
先确认是a,b的值不对,还是printf的问题吧

我简单测试一下:


谢谢 大神:Cliff 和4924080,确实是打印输出的问题,计算是对的。

Eric321 发表于 2013-11-24 00:07:14

学习学习一下
页: [1]
查看完整版本: keil MDK 计算64位整型出错!