为何Pascal代码循环15次却输出16位二进制数?
十进制转二进制输出位数异常的原因分析
你遇到的位数异常,本质是代码里存在两次输出操作,导致输出次数叠加。
问题根源拆解
你的Dec2Dual过程内部已经写了一个完整的16位输出循环(FOR i := 15 DOWNTO 0 DO write(Integer(dualCalc[i])))。如果测试时你没删掉这段代码,又在主程序里额外加了一段输出逻辑,就会出现两种异常情况:
- 当你把过程里的循环改成
15 DOWNTO 1(15次输出),主程序再输出1次dualCalc[0],总输出就是15+1=16位,正好是你看到的正确结果; - 当你把过程里的循环改回
15 DOWNTO 0(16次输出),主程序的额外输出还在,总输出就变成16+1=17位,也就是多了一个末尾0的错误结果。
转换逻辑验证
你的十进制转二进制的存储逻辑是正确的:
- 从
dualCalc[0]开始存最低位(LSB),每次取余数存入数组,再将十进制数整除2,直到数为0或填满16位; - 以输入10为例,
dualCalc[0]=0、dualCalc[1]=1、dualCalc[2]=0、dualCalc[3]=1,其余元素默认是FALSE(对应0),所以从高位到低位(15到0)输出就是正确的16位二进制0000000000001010。
修正方案
只需要保留一处输出即可,比如把过程里的输出代码删掉,统一在主程序里输出:
PROGRAM ConvertNum; TYPE dual = ARRAY[0..15] OF BOOLEAN; PROCEDURE Dec2Dual (decimal: INTEGER; VAR dualCalc: dual); VAR i: INTEGER; calculation: INTEGER; BEGIN i := 0; WHILE (i < 16) AND (decimal > 0) DO BEGIN calculation := decimal mod 2; dualCalc[i] := (calculation <> 0); // 简化布尔值赋值 decimal := decimal div 2; i := i + 1; END; END; VAR aThree: ARRAY[0..15] OF BOOLEAN; inputVar: INTEGER; BEGIN readln(inputVar); Dec2Dual(inputVar, aThree); // 主程序统一输出16位二进制 FOR i := 15 DOWNTO 0 DO write(Integer(aThree[i])); writeln; // 换行优化显示 END.
内容的提问来源于stack exchange,提问作者Slan
相关产品推荐
相关产品推荐

