有关int与unsigned的区别

本文详细探讨了C语言中int与unsigned int的主要区别,特别是负数表示和右移操作的不同。通过实例代码展示了有符号和无符号整数在右移时的算术和逻辑差异,并强调了理解这些基础知识的重要性。文章最后提到了有符号与无符号数之间的转换规则及其可能带来的影响。
摘要由CSDN通过智能技术生成

以前在学习C语言时一直没有彻底的明白unsigned int 与int的区别,当时好像有一个概念就是负数用补码来表示,而相应的补码是通过把原码取反后加1得到补码,在其中符号位是不变的。今天到一本书上说,对于无符号数据来说,右移是逻辑的,也就是说在高位上是补0的,这个是肯定的,道理很明显;而对于有符号的数据,其右移为 算术的逻辑的都是可以的,不过基本上所有的编译器与机器组合对于有符号数据都使用算术右移,也就是说高位补符号位。验证如下:

在这里取十进制数34来做为例子,在这里我才想起来从原码到补码的算法,一开始还把符号位都变了,真是基础知道不扎实啊。

34转换成十六进制就是0X22,二进制为00100010,

对于-34来说,对应的为二进制原码为:1000 0000 0000 0000 0000 0000 0010 0010,其反码为:1111 1111 1111 1111 1111 1111 1101 1101,通过加1得到补码,在机器中负数是通过补码来表示的:1111 1111 1111 1111 1111 1111 1101 1110,十六进制为0xffffffde;

接下来我把其右移3位,按理论上来说结果应该是:1111 1111 1111 1111 1111 1111 1111 1011,即0XFFFFFFFB。<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值