python 无符号数 有符号数 转换 无符号数的输出_补码

1 无符号数的输出

无符号数可以以八进制、十进制和十六进制的形式输出,它们对应的格式控制符分别为:

python 无符号数 有符号数 转换 无符号数的输出_无符号数_02


short,int,long三种变量都是定义的有符号数,最高位表示符号。

它们在内存中存储的值为:a->0100; b->1…0000001->1…1111110(反码)->1…1111111(补码)=ffffffff; c->720。

而%ho,%x,%lu都是只能按照无符号数输出,所以在处理时a,b,c的所有位都当成了有效值,因此输出b=0xffffffff

2 有符号数的输出

%d是按照有符号数来输出的,而m,n,p这三个是无符号数,在内存中的值就是他们本身。

但如m,printf(%d)拿到它之后发现是1…1111,会把它的最高位当做符号位,因此会认为他是负数(即把1…1111当做补码),因此在输出时会求出它的原码,对负数求原码按照取反加一的方法再操作一次补码即可

1…1111->1…0000(取反)->1…0001(-1)。

n同理:

python 无符号数 有符号数 转换 无符号数的输出_有符号数_03


python 无符号数 有符号数 转换 无符号数的输出_c语言_04


python 无符号数 有符号数 转换 无符号数的输出_有符号数_05


摘抄:再次强调,不管是以 %o、%u、%x 输出有符号数,还是以 %d 输出无符号数,编译器都不会报错,只是对内存的解释不同了。%o、%d、%u、%x 这些格式控制符不会关心数字在定义时到底是有符号的还是无符号的:

1.你让我输出无符号数,那我在读取内存时就不区分符号位和数值位了,我会把所有的内存都看做数值位;

2.你让我输出有符号数,那我在读取内存时会把最高位作为符号位,把剩下的内存作为数值位。

说得再直接一些,我管你在定义时是有符号数还是无符号数呢,我只关心内存,有符号数也可以按照无符号数输出,无符号数也可以按照有符号数输出,至于输出结果对不对,那我就不管了,你自己承担风险。