麻了,麻了,终于知道c语言为啥那么容易从入门到放弃了

麻了,麻了,这谁看不迷糊。 (温馨提示:出题时程序一般不会将每一种情况列出,会选其中一个或多个;请勿以答案相同认为思路相同)

见了这种题怎么办?

猜?这多少分之一的概率?

死记?它变个数字又不同了,那得记多少?

放弃?好像只能这样了。(不行,不行)

今天,博主来教你们彻底解决这些问题。

众所周知整数有三种存储形式:原码、反码、补码,在内存中为补码。 (若不清楚原码、反码、补码或不明白进制转换,建议先对其进行学习)

128的原、反、补码相同为:(8位二进制一组便于观察,整体为4字节整型)

00000000 00000000 00000000 10000000

以char形式(包括unsigned char,大小均为一字节)存储入内存中为:10000000。其中unsigned char形式无符号位以%d形式输出,先以无符号形式整型提升(全补0)变为:

00000000 00000000 00000000 10000000

再以整型(有符号位、十进制)输出即128。以%u形式输出,加粗部分不变,以无符号整型输出(最高位不作符号位而为数值),仍为128

其中char形式有符号位以%d形式输出,先以有符号形式整型提升(全补符号位(符号位为二进制最高位))变为:

11111111 11111111 11111111 10000000

再以整型(有符号位、十进制)输出,因其符号位为1是负数原、反、补码不同,化为原码变为

10000000 00000000 00000000 10000000十进制为-128。%u形式输出,加粗部分不变,以无符号整型输出(最高位不作符号位而为数值),为4294967168。

-128的原、反、补码不同,先用原码推至补码

10000000 00000000 00000000 10000000        --原码

11111111 11111111 11111111 01111111               --反码(原码符号位不变,其它位取反)

11111111 11111111 11111111 10000000             --补码(反码加1)

以char形式(包括unsigned char,大小均为一字节)存储入内存中为:10000000。

其中unsigned char形式无符号位以%d形式输出,先以无符号形式整型提升(全补0)变为:

00000000 00000000 00000000 10000000

再以整型(有符号位、十进制)输出即128。以%u形式输出,加粗部分不变,以无符号整型输出(最高位不作符号位而为数值),仍为128

其中char形式有符号位以%d形式输出,先以有符号形式整型提升(全补符号位(符号位为二进制最高位))变为:

11111111 11111111 11111111 10000000

再以整型(有符号位、十进制)输出,因其符号位为1是负数原、反、补码不同,化为原码变为

10000000 00000000 00000000 10000000十进制为-128。%u形式输出,加粗部分不变,以无符号整型输出(最高位不作符号位而为数值),为4294967168。

注重点:整型提升不以输出时的有无符号位决定而以创建时的有无符号位决定。

如此看来,这也不难,明其道理可举一反三,所以学习虽不易,但请勿放弃。

如果这篇文章对你有帮助请点个关注和赞。

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值