我想知道如何将整数转换为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
答案 0 :(得分:4)
以前的答案是正确的,需要(和正确的方法)来检查整数大小。
或者,定义您自己的整数类型并完成“问题”!
但是如果整数加法溢出并返回负数,则表示您没有使用Ada编译器!
遗憾的是,Gnat默认情况下不是Ada编译器。
使用Gnat,您需要设置编译器标志以启用溢出等检查,默认情况下应该启用。然后这样的溢出会引发Constraint_Error异常,并带有一条直接指向失败的代码行的消息 - 使得测试比对逆向工程出错更容易!
gnatmake -gnataeEfoUv -fstack-check my_main.adb
是一个相当全面的集合,可能包含一些您不想要的样式检查:查看Gnat文档以获取更多详细信息。
欢迎使用首选标志集的其他建议。
如果您正在使用其他编译器,我很想知道它是什么。
顺便说一下,你还没有提供StringToInt函数,所以没有其他人可以测试你的例子,但是我会指出它生成的值与你所提供的字符串所期望的值完全不同...是吗随机哈希生成器?
答案 1 :(得分:3)
(这应该是一个评论,但它太长了所以我提交它作为答案)
我要做的第一件事实际上是验证long_int是你认为的那样,即做INTEGER'SIZE
和LONG_INTEGER'SIZE
,很可能在你的平台上它们的大小相同,
来自Ada的定义:
请注意,这些类型的范围和大小可能不同 每个平台(当然除了布尔和 [[Wide_] Wide_]字符)。有一个实现要求 Integer类型的大小至少为16位,Long_Integer的大小 至少32位(如果存在)RM 3.5.4(21..22)(带注释)。所以,如果你 想要您的类型的完全可移植性,不要使用标准类型 (除非你必须,见下文),而是定义你自己的类型。一个 编译器将拒绝其范围不能的任何类型声明 满足。
如果它们的大小相同,那么当你添加2个非常大的整数时,你可能会溢出,从而得到你看到的结果。
来源:http://en.wikibooks.org/wiki/Ada_Programming/Libraries/Standard