C语言中的有符号数与无符号数

先看一段代码

#include<stdio.h>
int i;    // i是全局变量,不初始化,则默认为0
int main(void)
{
	i--;
	if(i > sizeof(i)) 
		printf(">\n");
	else
	{
		printf("<\n");
	}
	return 0;
}

错误的想法:

i 是全局变量,没有初始化,默认为0. 因此 i-- 操作以后,i 的值为 -1. sizeof操作符将返回 i (int类型)的字节为 4.因此 i < sizeof(i),所以打印 " < "


分析:

sizeof 算出的结果返回的类型是 unsigned int 型,而 i 是 int型。
在将int型与unsigned int型做对比时,会先把 int 型准换为 unsigned int型,然后再进行比较。-1 的补码为1111 1111 1111 1111 1111 1111 1111 1111,转换为unsigned int 类型,表示非常大的数,因此,应该打印 " < "

知识点:

计算机中32位int类型变量的范围,其中int类型是带符号整数。
正数在计算机中表示为原码,最高位是符号位
1的原码为 0000 0000 0000 0000 0000 0000 0000 0001
2147483647的原码为 0111 1111 1111 1111 1111 1111 1111 1111
所以最大的正整数是 2147483647

负数在计算机中表示为补码,最高位为符号位
-1
原码为 1000 0000 0000 0000 0000 0000 0000 0001
反码为 1111 1111 1111 1111 1111 1111 1111 1110
补码为 1111 1111 1111 1111 1111 1111 1111 1111

-2147483647
原码为 1111 1111 1111 1111 1111 1111 1111 1111
反码为 1000 0000 0000 0000 0000 0000 0000 0000
补码为 1000 0000 0000 0000 0000 0000 0000 0001


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值