VAR
B:BYTE;
begin
B:=0;
SHOWMESSAGE(inttostr(pred(b) )); //-1
B:=255;
SHOWMESSAGE(inttostr(succ(b) )); //256
SHOWMESSAGE(inttostr(high(b))); //255
SHOWMESSAGE(inttostr(low(b)));   //0
INC(b);
showmessage(inttostr(b));  //0
 b:=b-1;
showmessage(inttostr(b));//255end;

解决方案 »

  1.   

    Byte = $FF  再加1後多少?
      

  2.   

    对了,我在{$R+} 与 {$R-} 的情况下结果都是相同的 delphi 2007 update 4
    CodeGear™ Delphi® 2007 for Win32®  Version 11.0.2902.10471 可是在delphi 精要里面说的,应该是不同才对,为什么?
      

  3.   


    问题byte 的最大取值应只能到255 ,而不是256 
    B:=255;
    INC(B);
    结果为0,而不是256
      

  4.   

    B   應該是 move Bl $FF
              Show的時候  inc(EAX);
      

  5.   

      ShowMessage(Inttostr(Byte(Succ(B))));   嘗試這樣去寫
      

  6.   


    因為ShowMessage 的時候已經將  8位寄存器中的值移動16位子EAX中了,  再SUCC的時候 int(integer); // 所以沒有越界
      

  7.   


    也就是因为我是用inttostr ,所以才出现这样的结果,谢谢!
      

  8.   

    呵呵,對了。這些基礎的東西學會看調試中的匯編代碼。
    procedure TForm1.Button1Click(Sender: TObject);
    var
      A,B : Byte;
    begin
      {$R+}
      A := 255;
      B := 255;
      A := A+1;
      B := B+1;  ShowMessage(Inttostr(Byte(Succ(B))));
    end;另外上面這段代碼會有提示的,加了越界保護
      

  9.   

    有没有办法显示转换前的结果,也就是直接把byte 转成字符串,而不是用inttostr,用了inttostr(好像是编译器优化了,结果已经不是byte 了,而是integer 类型的了。
      

  10.   

    b:=0;
    if pred(b)<0 then showmessage('ok'); //ok
    上面的运算结果已经是integer类型的了
      

  11.   

    Unit2.pas.33: b:=1;
    0045DA0E B301             mov bl,$01
    Unit2.pas.35: b:=b-1;
    0045DA10 4B               dec ebx
    Unit2.pas.36: if pred(b)<0 then
    0045DA11 0FB6FB           movzx edi,bl
    0045DA14 4F               dec edi
    0045DA15 85FF             test edi,edi
    0045DA17 7D0A             jnl $0045da23看不懂汇编代码,这两个数比较是如何比的..............
      

  12.   

    看来是因为CPU寄存器是32位的,也就是与integer 的默认类型一样大小,所以进行这个操作时,不会进行类型转换,而返回值也没有去了高位。