DelphiXE10.3中字符相加导致溢出的问题

测试环境:DelphiXE10.3

const
  s1: ansistring = #100#200;
  s2: ansistring = #100 + #200;

begin
  ShowMessage(IntToStr(Ord(s1[2])));
  ShowMessage(IntToStr(Ord(s2[2])));
end;

原本一直以为上面代码出来的结果应该是一样的。但是在XE10.3中测试结果却显示,第一个对话框结果为200,而第二个对话框显示为63。

经过测试验证,当使用+符号对字符进行串接时,#128(#$80)以下的字符是正常的,一旦超过#128就会溢出变成#63(#$3F)。

尚不明确是否有哪个编译指令开关可以控制这一编译器行为,目前的解决方案是不要使用+,而是全部写在一起不换行。

PS:19.12.6 补充来自Q群内大神菜根提供的解决方案

一、显性告诉编译器我们需要的是RawByteString

//原代码如下,编译后,部分字节会变成#63
  Template: RawByteString = #$55#$8B#$EC#$83#$C4#$F8#$C7#$45#$F8#$21#$43#$65#$87 +
    #$8B#$45#$10#$50#$8B#$4D#$0C#$8B#$55#$08#$B8#$78#$56#$34#$12#$FF#$55#$F8#$89 +
    #$45#$FC#$8B#$45#$FC#$59#$59#$5D#$C2#$0C#$00;

//改为以下,显性告诉编译器,每行都是RawByteString,可以避免错误
  Template: RawByteString = RawByteString(#$55#$8B#$EC#$83#$C4#$F8#$C7#$45#$F8#$21#$43#$65#$87) +
    RawByteString(#$8B#$45#$10#$50#$8B#$4D#$0C#$8B#$55#$08#$B8#$78#$56#$34#$12#$FF#$55#$F8#$89) +
    RawByteString(#$45#$FC#$8B#$45#$FC#$59#$59#$5D#$C2#$0C#$00);

二、将Project的CodePage设置为1252

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值