Random Ada中的数字转换

Random Ada中的数字转换,random,key,ada,Random,Key,Ada,我想知道如何将整数转换为长整数,将长整数转换为正计数。我尝试过的每一种方法都给了我错误,即使在这种情况下转换应该很容易 例如,做 long := long_integer(int1) + long_integer(int2); 即使两个整数都是正值,有时也会使long成为负值 我正在运行的函数的代码,用于调试的步骤: --calcKey-- procedure calcKey(x: in String16; key: out External_IO.Positive_Count) is s

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

例如,做

long := long_integer(int1) + long_integer(int2);
即使两个整数都是正值,有时也会使long成为负值

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

--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
(这应该是一个评论,但太长了,所以我将其作为答案提交)

我要做的第一件事是验证long_int是否是您所认为的,即执行
INTEGER'SIZE
long_INTEGER'SIZE
,很可能是在您的平台上,它们的大小完全相同

根据Ada的定义:

请注意,这些类型的范围和大小在不同的情况下可能会有所不同 每个平台(当然布尔和 [[Wide\]Wide\]Character)。有一个实现要求: Integer类型的大小至少为16位,Long_Integer类型的大小至少为16位 至少32位(如有)RM 3.5.4(21..22)(带注释)。所以如果你 要使您的类型具有完全的可移植性,请不要使用标准的类型 (除非您必须这样做,请参见下文),而是定义您自己的类型。A. 编译器将拒绝任何类型声明,因为它不能拒绝其范围 满足

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


来源:

关于检查整数大小的需要(以及正确的方法),前面的答案是正确的

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

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

不幸的是,Gnat在默认情况下不是Ada编译器

对于Gnat,您需要设置编译器标志以启用诸如溢出之类的检查,这在默认情况下应该是启用的。然后,这样的溢出将引发Constraint_Error异常,消息直接指向失败的代码行,这使得测试比反向工程错误代码要容易得多

gnatmake -gnataeEfoUv -fstack-check my_main.adb
是一个相当全面的集合,可能包括一些您不想要的样式检查:查看Gnat文档了解更多详细信息

欢迎对首选标志集提出其他建议

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


顺便说一句,您没有提供StringToInt函数,因此没有其他人可以测试您的示例,但我要指出,它生成的值与您提供的字符串中的值非常不同。。。它是一个随机散列生成器吗?

是的。整型和长整型显然大小相同。谢谢。这是一个糟糕的随机散列生成器,我需要用于分配任务。我认为奇数值是整数中垃圾数据的剩余值,因为它们与字符串的大小不同。我的作业说字符串和整数的大小相同,但我现在知道这不是真的。我在这节课上自学了Ada,所以我仍然学到了很多。我正在使用Gnat和GPS。