【有符号和无符号】

在这里插入图片描述

1 无符号数的输出

无符号数可以以八进制、十进制和十六进制的形式输出,它们对应的格式控制符分别为:在这里插入图片描述
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同理:在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
摘抄:再次强调,不管是以 %o、%u、%x 输出有符号数,还是以 %d 输出无符号数,编译器都不会报错,只是对内存的解释不同了。%o、%d、%u、%x 这些格式控制符不会关心数字在定义时到底是有符号的还是无符号的:
1.你让我输出无符号数,那我在读取内存时就不区分符号位和数值位了,我会把所有的内存都看做数值位;
2.你让我输出有符号数,那我在读取内存时会把最高位作为符号位,把剩下的内存作为数值位。
说得再直接一些,我管你在定义时是有符号数还是无符号数呢,我只关心内存,有符号数也可以按照无符号数输出,无符号数也可以按照有符号数输出,至于输出结果对不对,那我就不管了,你自己承担风险。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值