为什么这个Java代码的行为与这个C代码不同?
我是如何来到这里的;涉及一个Brainfuck到C编译器和一个Brainfuck到JVM字节码编译器。。。这似乎无关紧要。 问题中的Brainfuck代码如下:为什么这个Java代码的行为与这个C代码不同?,java,c,brainfuck,Java,C,Brainfuck,我是如何来到这里的;涉及一个Brainfuck到C编译器和一个Brainfuck到JVM字节码编译器。。。这似乎无关紧要。 问题中的Brainfuck代码如下: >-[[<+>>>-<-<+]>] >-[[>>-这些代码不相等: C版本将字节数组分配为Java的整数数组 C版本不像Java那样进行数组元素的钳制 因此,在Java中,您应该创建一个字节数组: byte[] tape = new byte[30000]; 并在调整()功能中拆下夹紧
>-[[<+>>>-<-<+]>]
>-[[>>-这些代码不相等:
C版本将字节数组分配为Java的整数数组
C版本不像Java那样进行数组元素的钳制
因此,在Java中,您应该创建一个字节数组:
byte[] tape = new byte[30000];
并在调整()功能中拆下夹紧装置:
// if(tape[dp] < 0) tape[dp] += 255;
// if(tape[dp] > 255) tape[dp] -= 255;
//如果(磁带[dp]<0)磁带[dp]+=255;
//如果(磁带[dp]>255)磁带[dp]=255;
那么Java的版本也将终止
或者,如果要保留整数数组,则必须更改溢出/下溢规则:
if(tape[dp] < 0) tape[dp] = 256-Math.abs(tape[dp]) % 256;
if(tape[dp] > 255) tape[dp] = tape[dp] % 256;
if(tape[dp]<0)tape[dp]=256 Math.abs(tape[dp])%256;
如果(磁带[dp]>255)磁带[dp]=磁带[dp]%256;
因为您的实现不正确欢迎使用StackOverflow。如中所述,此网站是有用问题及其答案的存储库,而不是帮助论坛。您有两种语言的调试器,请使用它们。请参加,访问,特别是阅读并学习如何有效使用此网站。提示:C程序是我们的在Java程序使用实例变量(字段)的情况下调用函数参数(有效的局部变量;按值传递)。您是否尝试过分步调试它?您甚至可以并排调试,并精确地观察它何时开始不同。@ruakh抱歉,这是真的,我只是通过将“dp”设置为全局来更正它,行为是一样的。我将更新帖子。这就是逐步通过代码查看他们在哪里做了不同的事情应该会发现问题的地方。这让我感到困惑,因为在C版本中,我使用的是无符号8位(在我的平台和编译器上)整数;0-255。我试图在Java中通过使用32位整数并自己实现包装功能来模拟这一点。我测试了C代码以验证它是否包装(即255+1==0和0-1==255)所以我不明白为什么它们的行为不同。请参阅我的答案编辑。是的,确实C执行下溢/上溢,但您错误地实现了它们
// if(tape[dp] < 0) tape[dp] += 255;
// if(tape[dp] > 255) tape[dp] -= 255;
if(tape[dp] < 0) tape[dp] = 256-Math.abs(tape[dp]) % 256;
if(tape[dp] > 255) tape[dp] = tape[dp] % 256;