负数进制转换关键在于余数必须非负且小于基数,并统一用向下取整求商;-13转二进制正确过程为:-13÷2得商-7余1,-7÷2得商-4余1,-4÷2得商-2余0,-2÷2得商-1余0,-1÷2得商-1余1,再继续至商为0为止,最终余数倒序得1101;工程中更推荐用补码法。

负数用取余法做进制转换时,关键不是直接套用正数规则,而是要保证每一步的余数落在目标进制的合法范围内(比如转二进制,余数只能是 0 或 1;转十六进制,余数只能是 0–15),否则结果会错乱或无法拼接。
余数必须非负且小于进制基数
例如转 -13 为二进制,若机械地用 -13 ÷ 2 = -6 余 -1,这个余数 -1 就非法。正确做法是调整商,让余数落在 [0, 1] 区间内: -13 = 2 × (-7) + 1 → 商取 -7,余数为 1(因为 -13 − 2×(-7) = 1)。 这等价于公式:余数 = (被除数 % 基数 + |基数|) % |基数|,确保结果恒为非负最小同余数。
商的取法要统一向下取整
正数除法默认向下取整(如 7÷2=3),但负数在多数语言中是向零取整(如 -7÷2=-3),这会导致余数符号不一致。为保持逻辑统一: - 每次计算后,若余数为负,就让商减 1(相当于多扣一次基数); - 或直接用数学定义重算:商 = floor(被除数 / 基数),再反推余数 = 被除数 − 商 × 基数。
实际操作步骤(以 -13 转二进制为例)
- −13 ÷ 2 → 商 = −7,余数 = 1(因 −13 = 2×(−7) + 1)
- −7 ÷ 2 → 商 = −4,余数 = 1(因 −7 = 2×(−4) + 1)
- −4 ÷ 2 → 商 = −2,余数 = 0
- −2 ÷ 2 → 商 = −1,余数 = 0
- −1 ÷ 2 → 商 = −1,余数 = 1?不对——应再算:−1 = 2×(−1) + 1,但商未变,继续;更稳妥是算到商为 0 为止: −1 ÷ 2 → 商 = −1,余数 = 1;再算 −1 ÷ 2,仍得余 1……容易卡住。所以实际中常改用“先转绝对值,再按补码规则处理”,尤其在固定位宽场景下。
更推荐的工程做法:结合补码机制
对有符号整数(如 8 位、32 位),负数进制转换通常不靠手工除基取余,而是: - 先求对应正数的二进制原码; - 按位取反得反码; - 末位加 1 得补码(即该负数在计算机中的真实二进制表示); - 这个补码可直接用于转其他进制(如转十六进制,每 4 位一组查表即可)。
不复杂但容易忽略细节,核心就两条:余数必须合法、商要向下取整。手动算少量负数可用调整法,大批量或编程实现建议走补码路径,稳定又符合硬件逻辑。











