我想将一个整数从0转换为65355,为此,我需要一个两个字节的表示形式。我试图将其除以2、8倍,并在其余部分为1时求和2的幂,然后将该整数强制转换为字节,但是遇到满足字节限制(256)的问题。第二个字节将是第8分区的其余部分,我也很难将其转换为字节。
以下是我先前描述的函数方法的代码:
method convertBin(i:int) returns (b:seq<byte>)
requires 0<=i<=65535;
{
var b1:=0;
var q:=i;
var j:=0;
while j<8
invariant 0<=j<=8 && (b1 as int)< power(2,j)
decreases 8-j
{
var p:int;
if(q%2==1){
p:=power(2, j);
b1:=b1 + p;
q:=q/2;
}
j:=j+1;
}
b1:=b1 as byte;
b:=[b1]+[q as byte];
}
答案 0 :(得分:0)
要完成示例,您需要更强的循环不变性。但是您根本不需要循环,因为没有理由只将其除以2。
这里使用byte
作为子集类型:
type byte = x | 0 <= x < 256
method convertBin(i: int) returns (b1: byte, b0: byte)
requires 0 <= i < 0x1_0000
ensures i == 256 * b1 + b0
{
b1, b0 := i / 256, i % 256;
}
这里是相同的程序,但是byte
是newtype
:
newtype byte = x | 0 <= x < 256
method convertBin(i: int) returns (b1: byte, b0: byte)
requires 0 <= i < 0x1_0000
ensures i == 256 * b1 as int + b0 as int
{
b1, b0 := (i / 256) as byte, (i % 256) as byte;
}
Rustan