System.Val:字符串到整数的转换,没有明确的基本规范

问题描述 投票:0回答:2

我不明白如何在 Borland Pascal 中将

xa
转换为
10
。我只是用

Val('xa', value, return);

value
变为
10
return
变为
0
(表示转换成功)。我只是个新手,谁能解释一下?我知道这不喜欢 ASCII,因为它只是一个字符。

我正在使用 Free Pascal ☺

我使用

xa
0xa
$xa
在 Free Pascal 中对其进行了测试。所以,我认为
Val
可以理解像
$
0
这样的特殊字符,而不需要调用像
Hex2Dec
这样的专门函数。是这样吗?

delphi freepascal turbo-pascal
2个回答
6
投票

从早期的 Delphi 开始,核心整数转换例程不仅仅执行数字序列,还执行一些特殊操作,例如用于十六进制或 C 样式 0x02 的 Pascal“$924”。

FreePascal 在后来开始添加 Delphi 兼容性时(大约 1997-2003 年)采用了它。除了这个区别之外,另一个不同之处是最后一个参数(示例中的 RETURN)从 WORD(在 Turbo Pascal 中)更改为 Delphi 中的整数/长整型。

IOW,例程接受 x 并认为您的意思是转换 C 样式的十六进制数,然后根据 Stuart 的表解释“a”。

它还将 % 解释为二进制,将 & 解释为八进制。

尝试

val('$10',value,return);
writeln(value,' ' ,return);  // 16 0
val('&10',value,return);
writeln(value,' ' ,return);  // 8 0
val('%10',value,return);
writeln(value,' ' ,return);  // 2 0

并比较结果。

请注意,这可能不适用于非常古老的 Pascal,例如 Turbo Pascal 和 2000 年之前的 Free Pascal。 % 和 & 是 FPC 特定的,用于匹配文字符号扩展(类似于 $,但适用于二进制和八进制)

var x : Integer
begin
x:=%101010;  //42
x:=&101;     //65

2
投票

这不适用于所有 Pascal 编译器,并且您没有说明您正在使用什么 Pascal 编译器,但看起来,“xa”中的 x 表示这是一个十六进制(以 16 为基数)数字,并且该值十六进制数的位数如下:

Digit Value
0      0
1      1
2      2
3      3
4      4
5      5
6      6
7      7
8      8
9      9
a     10
A     10
b     11
B     11
c     12
C     12
d     13
D     13
e     14
E     14
f     15
F     15
© www.soinside.com 2019 - 2024. All rights reserved.