【问题标题】:How can a number, around pow(2,39), be too large for a 64-bit integer value?pow(2,39) 附近的数字如何对于 64 位整数值来说太大了?
【发布时间】:2021-05-31 00:35:51
【问题描述】:

我正在使用 Progress-4GL,版本 11.6,appBuilder 和过程编辑器。

我有一个值为“1000000000000”的字符串,我想将其转换为整数。
首先我尝试使用简单的转换来做到这一点,但这不起作用:

Result = INT(value). => runtime error 15747.

由于提到的值大约是 2^39INT 似乎用于 32 位值,这似乎是正确的。

所以,我决定使用更大的数据类型,INT64,但这似乎给出了相同的错误信息:

Result = INT64(value). => again runtime 15747.

这怎么可能?一个 64 位整数怎么可能无法保存 2^39 附近的值?

哦,如果你想知道我是在创建一个 32 位还是 64 位应用程序,我不知道,我如何从程序编辑器/appBuilder 中知道?

【问题讨论】:

  • 您能否说明究竟是如何进行“简单转换”的?最好使用确切的字符串"1000000000000"。当然,一个 64 位整数可以容纳 2^39。
  • @MSalters:老实说,字符串的确切值是"0001000000000000",但即使是开头多余的零,这个数字也不应该太大。

标签: openedge progress-4gl integer-overflow


【解决方案1】:

ABL INT64 不依赖于 Progress 运行时的进程架构(32 位或 64 位)。 AVM 隐藏了这些细节。 ABL INT64 可以容纳从 -9223372036854775808 到 9223372036854775807

这在这里工作得很好。我什至加了几个零。

DEFINE VARIABLE i AS INT64 NO-UNDO.

ETIME (YES)   .

i = INT64 ("1000000000000") .

MESSAGE "time" ETIME SKIP 
        "i" i 
    VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
    
    
ETIME (YES)   .

i = INT64 ("100000000000000000") .

MESSAGE "time" ETIME SKIP 
        "i" i 
    VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.    

您的变量 Result 是定义为 INTEGER 还是 INT64 ?

【讨论】:

  • 你是对的(像往常一样:-)),问题不在于转换,而是我放入信息的变量的类型定义。再次感谢您的快速帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
相关资源
最近更新 更多