You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 21:57:36