首页 > 解决方案 > Pascal:Val() 函数返回负数

问题描述

我一直在尝试将字符串转换为整数并且 val() 过程返回一个负数,我认为这是因为字符串太大(没有意义,字符串的长度约为 8),所以我尝试手动进行转换,它返回的数字与 val() 返回的数字完全相同:

program a;
uses crt;

var
    text:string;
    number, code:integer;

begin
    number:=0;
    
    text := '3142436';
    val(text, number, code);
    
    writeln('Number: ', number);
    writeln('Code: ', code);
    
    
end.

它返回:

Number: -3292
Code: 0

制作我自己的转换程序:

program a;
uses crt;

var
    numero, cod:integer;
    info:string;
    i:char;

begin
    cod:=0;
    numero:=0;
    info:='3142436';

    for i in info do
        begin
            case i of
                '0': cod:= 0;
                '1': cod:= 1;
                '2': cod:= 2;
                '3': cod:= 3;
                '4': cod:= 4;
                '5': cod:= 5;
                '6': cod:= 6;
                '7': cod:= 7;
                '8': cod:= 8;
                '9': cod:= 9;
            end;
            numero := (numero * 10) + cod;
            write('Now: ', numero);
            writeln(' (Adding ',cod, ')');
        end;
    
    writeln('Result: ', numero);
    
end.

返回完全相同:

Now: 3 (Adding 3)
Now: 31 (Adding 1)
Now: 314 (Adding 4)
Now: 3142 (Adding 2)
Now: 31424 (Adding 4)
Now: -13437 (Adding 3)
Now: -3292 (Adding 6)
Result: -3292

有什么我做错了吗?

标签: procedurepascal

解决方案


您显然使用的是 16 位整数类型。

3142436 是 $2FF324,截断成一个单词是 $F324。解释为有符号整数,十进制为 -3292。

有许多 Pascal 实现。您没有指定您使用的是哪一个,但显然Integer是您当前编译器设置的 16 位整数。


推荐阅读