C获得int的最大值最小值,算术右移,逻辑右移

以int为4字节为例

unsigned int 0的二进制表示为(后面解释为什么用unsigned int

00000000 00000000 00000000 00000000

那么对其取反得:

11111111 11111111 11111111 11111111

因为int型第32位为符号位,所以要对上数右移一位,既得:

01111111 11111111 11111111 11111111

即2147483647



最小值即对上数再进行取反,得:

10000000 00000000 00000000 00000000 

即-2147483648


代码如下:

int main(int argc, char *argv[])
{
	int a=(~(unsigned int)0)>>1;
	printf("max:%d\nmin:%d \n",a,~a);
  	system("PAUSE");
  	return 0;
}



13年8月11日 

补充:

关于为什么要用unsigned int 0来进行操作:

这涉及到两个概念,逻辑右移和算数右移

所谓逻辑右移就是,空缺的高位补零。

所谓算术右移就是,要保持符号位不变。


如果使用 unsigned  int 0来进行初始操作,则没有符号位,右移操作是逻辑右移。

如果使用int 0来进行初始操作,则最高位是符号位,而有符号数的>>操作是编译器相关的。

即不同编译器,有可能进行算术右移,也有可能进行逻辑右移。


另外,算术左移逻辑左移是相同的,不要求保持符号位不变。


总结一下:

算术左移、逻辑左移、逻辑右移:空缺用0补。

算术右移:空缺用符号位补即符号位自身回溯,保证正为正,负为负。


综上,由于>>操作的编译器相关导致的不确定性,《C和指针》建议,不要对有符号数进行>>操作。


另外,用cout输出十六进制和八进制,可用如下方式:

#include <iomanip>

cout<<setbase(16)<<a;

参数只支持8 16 10,其他参数视为10,自己试的,有错误请提出。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值