9/24 第六次博客

今天java听的数据精度,50的阶乘算出来是负数,与原码有关
Java 中使用 long 类型计算 50 的阶乘得到负数,这个现象和原码没有关系,本质是有符号整数的补码溢出。Java 里的 long 是 64 位有符号整型,在计算机内部,所有整数的加减乘运算都是基于补码完成,而非原码。long 能够保存的最大正数是(2^{63}-1),当计算阶乘到 21! 的时候,数值就已经超过 long 类型所能容纳的上限。继续不断相乘时,超出 64 位的高位数据会直接被丢弃,只保留低 64 位的补码。如果保留下来的这 64 位二进制最高位是 1,那么这个补码就会被解释为负数,于是就出现了正数连续相乘,最终结果却变成负数的情况。想要正确计算像 50! 这种超大整数,就不能使用固定长度的基本数据类型,需要使用 Java 提供的 BigInteger 类,它支持任意长度的大整数运算,不会发生溢出。

posted @ 2026-09-24 23:07  dmdba  阅读(6)  评论(0)    收藏  举报