有符号数与无符号数的比较 与 整型提升

C语言和C++中,有很多基本数据类型,如char,inf,float等,与此同时,还有一种特殊的数据类型容易被我们忽略–无符号数,它由unsigned修饰,如unsigned int等,当我们忽略了数据有无符号,就会引起一些错误。

我们来看代码一:

	char a = -1;
	signed char b = -1;
	unsigned char c = -1;
	printf("a=%d,b=%d,c=%d", a, b, c);	// a=-1 ,b=-1, c==255

在这里插入图片描述
为什么c的输出是255呢?我们来画图分析。
在这里插入图片描述
对大多数C语言的实现,处理同样字长的有符号数和无符号数之间的相互转换的一般规则是:数值可能会改变,但是位模式不变。也就是说,将unsigned int强制类型转换成int,或将int转换成unsigned int底层的位表示保持不变。
我们来看代码二:

	int a = -3;
	unsigned int b = 3;

	if (a>b)
		printf("a > b,a = %d,b = %u\n", a, b);
	else
		printf("a < b,a = %d,b = %u\n", a, b);

在这里插入图片描述
当执行一个运算时,如果它的一个运算数是有符号的而另一个数是无符号的,那么C语言会隐式地将有符号数强制类型为无符号数,并假设这两个数都是非负的,来执行这个运算。
我们再来看代码三:

	char a = -128;
	printf("%u\n", a);	//a=4294967168

在这里插入图片描述
在这里插入图片描述
以上我们可以看出,整形提升的规则:先看变量类型,有符号数整型提升时 补符号位 ,无符号数整型提升时 补0

猜你喜欢

转载自blog.csdn.net/lvxin15353715790/article/details/87931565