3

我想知道如何将整数转换为 long_integer,将 long_integer 转换为 Positive_Count。即使在那种情况下转换应该很容易,我尝试过的每一种方法都给了我和错误。

例如,做

long := long_integer(int1) + long_integer(int2);

即使两个整数都是正数,有时也会产生负值。

我正在运行的函数的代码,调试步骤拆分:

--calcKey--
procedure calcKey(x: in String16; key: out External_IO.Positive_Count) is
  s1, s2 : String2;
  int1, int2 : integer;
  long1, long2 : long_integer;
begin
  s1 := x(12..13); 
  s2 := x(15..16); 
  put_line("s1: " &s1& "- s2: " &s2);
  int1 := abs StringToInt(s1);
  int2 := abs StringToInt(s2); 
  put("int1: " & Integer'image(int1) & " | int: " & Integer'Image(int2)); new_line;
  long1 := long_integer(int1); 
  long2 := long_integer(int2);
  long1 := long1 + long2; 
  put_line("long := " & long_integer'Image(long1));
  long1 := (long1 mod 256) + 1;
  key := External_IO.Positive_Count(long1); 
  put_line("Key : " & External_IO.Positive_Count'Image(key));

  new_line;
end calcKey;

调用函数:

calcKey("0123456789abcdef",k);
calcKey("0123456789abcdef",k);
calcKey("0123456789abcdef",k);
calcKey("0123456789abcdef",k);
calcKey("fedvba9876543210",k);
calcKey("fedvba9876543210",k);

输出:

s1: bc- s2: ef
int1:  2011929758 | int:  1667393125
long := -615644413
Key :  4

s1: bc- s2: ef
int1:  287586 | int:  1667393125
long :=  1667680711
Key :  200

s1: bc- s2: ef
int1:  13132642 | int:  1667393125
long :=  1680525767
Key :  200

s1: bc- s2: ef
int1:  13132642 | int:  1667393125
long :=  1680525767
Key :  200

s1: 43- s2: 10
int1:  13120308 | int:  859058225
long :=  872178533
Key :  102

s1: 43- s2: 10
int1:  6697780 | int:  859058225
long :=  865756005
Key :  102
4

2 回答 2

4

先前的答案对于检查整数大小的需要(和正确的方法)是正确的。

或者,定义您自己的整数类型并解决“问题”!

但是,如果整数加法溢出并返回负数,则说明您没有使用 Ada 编译器!

不幸的是,Gnat 默认不是 Ada 编译器。

使用 Gnat,您需要设置编译器标志以启用检查,例如溢出,默认情况下确实应该启用。然后这样的溢出将引发 Constraint_Error 异常,并带有一条消息直接指向失败的代码行 - 使测试比必须对出错的地方进行逆向工程容易得多!

gnatmake -gnataeEfoUv -fstack-check my_main.adb

是一个相当全面的集合,可能包括一些您不想要的样式检查:查看 Gnat 文档以获取更多详细信息。

欢迎其他有关首选标志集的建议。

如果您使用的是另一个编译器,我很想知道它是哪个。

顺便说一句,您没有提供 StringToInt 函数,因此没有其他人可以测试您的示例,但我要指出的是,它生成的值与您提供的字符串所期望的值完全不同......它是随机散列吗发电机?

于 2012-12-04T10:50:24.243 回答
3

(这应该是评论,但太长了,所以我将其作为答案提交)

我要做的第一件事实际上是验证 long_int 是您认为的那样,即正在做INTEGER'SIZE并且LONG_INTEGER'SIZE,很可能在您的平台上它们的大小完全相同,

从 Ada 定义:

请注意,这些类型的范围和大小在每个平台上都可能不同(当然,布尔值和 [[Wide_]Wide_]Character 除外)。有一个实现要求,Integer 类型的大小至少为 16 位,Long_Integer 的大小至少为 32 位(如果存在) RM 3.5.4 (21..22)(已注释)。所以如果你想要你的类型的完全可移植性,不要使用标准中的类型(除非你必须,见下文),而是定义你自己的类型。编译器将拒绝其范围无法满足的任何类型声明。

如果它们的大小相同,则在添加 2 个非常大的整数时可能会溢出,从而给出您看到的结果。

来源:http ://en.wikibooks.org/wiki/Ada_Programming/Libraries/Standard

于 2012-12-04T06:38:20.983 回答