以C#里的short类型举例,short是8位2进制,和ushort的区别是,它们都是8个bit位,前者需要用1个bit表示正负符号,首位为1表示负数,为0表示正数,所以能表示数字的范围是 1111 1111~0111 1111( -127~127)
而无符号ushort就是说去掉1bit的符号位,它的表示范围就是0000 0000~1111 1111(0~255)。以此类推可以知道int类型和uint类型的表示范围,int是有32个bit位,int64是有64个bit位,表示范围用计算器按一下就知道了。
计算机里的加法是用补码来计算的。补码的规则是:正数和0的补码是它本身,负数的补码是全部位按位取反再加1。举个例子,比如1的补码是1;0的补码是0;-1(1000 0001)的补码是0111 1110+1=0111 1111(256-1=255)公式:256+负数=补码。
用short类型举例,计算(-1)+(-1)=255(补码)+255(补码)=510;超过256 所以减去256等于254(补),超过127,所以判断是补码,没超过就是最后的得数。因为short能表示的最大正数就是127,它用二进制表示就是一个负数,根据规则(补码-负数=256),那负数(得数)=补码-256,就是,254(补码)-256=-2(得数)。如果是-1+2=255(补)+2=257减去溢出部分256=1,1<127,所以结果就是1。在比如-3+2=253+2=255,大于127是补码,那么根据公式:255(补码)-256=-1(得数),这个-1就是最终的得数。总之补码相加后如果是负数就要把溢出的去掉,在减去256,正数就不变。如果是int32类型这个256就要变成2^32次方,然后超过2^31-1的就是补码,没超过就是正数或0。说到这里,补码其实就是用一个正数去表示负数,这个正数-负数=这个类型的整个表示范围数量比如256。在8位二进制里,计算负数的补码就是256+(负数),比如 -100的补码就是256+(-100)(负数)=156(补码),-100的补码在short类型里就是156。8位二进制的补码和负数的公式就是这样:
256=补码-负数;
负数=补码-256;
补码=负数+256。
这个补码就是把负数转换成一个正数来对待,这个补就是把剩余空间补满的意思。补码-负数=这个类型能表示的数字的个数,8bit位能表示的数字范围是256。
如果是int32,公式就是:
2^32=补码-负数;
负数=补码-2^32;
补码=2^32+负数。
这是个人看法,分享出来,也是自己对自己思考的一个总结。
计算机的有符号类型的加法(补码计算公式总结)
HelloLLLLL2026-09-28 3:14