C语言整型提升及算数转换

整型提升

整型提升的概念

整型提升的方法

示例

算数转换

算数转换的概念

算数转换的次序

示例1

示例2


整型提升

整型提升的概念

在表达式计算时,各种整型首先要提升为int类型,如果int类型不足以表示则要提升为unsigned int类型;然后执行表达式的运算。

整型提升的方法

整型提升按照变量数据类型的符号位来提升:

1.先看该数据是signed 还是unsigned。

2.再看此时符号位。

signed则1补1,0补0;unsined直接补0;

示例

#include<stdio.h>
int main()
{
	signed char a = -1;
	unsigned char b = -1;

	printf("a=%d,b=%d", a, b);

	return 0;
}

输出 a=-1,b=255

int类型大小4字节下-1的存储

10000000 00000000 00000000 00000001    -1的原码

11111111   11111111   11111111   111111110          反码

11111111   11111111   11111111   111111111          补码

char类型大小一字节,进行截断处理,-1的补码变为

11111111

在输出时进行整型提升,由上述方法可知,对于signed char a = -1;整型提升后

补码为

11111111 11111111 11111111 11111111

转换为原码为

10000000 00000000 00000000 00000001

故a=-1

对于unsigned char a = -1;整型提升后

补码为

00000000 00000000 00000000 11111111

正数转换为原码仍为

00000000 00000000 00000000 111111111

故b=255

算数转换

算数转换的概念

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数转换为另一个操作数的类型,否则操作就无法进行。

算数转换的次序

下表由下至上转换

long double
double
float
unsigned long int
long int
unsigned int
int

示例1

#include<stdio.h>
int main()
{
	int a = -1;
	unsigned int b = 1;
	if (a > b)
		printf("-1 > 1");
	else
		printf("-1 < 1");

}

a,b为不同类型,要进行算数转换,由次序可知a类型要从int-----> unsigned int

10000000 00000000 00000000 00000001     a的原码

11111111   11111111   11111111   111111111     a的补码

将a的补码视为unsigned int类型(无符号位),所以比较大小时a的实际值为二进制(11111111   11111111   11111111   111111111)的大小,必然大于b二进制(00000000 00000000 00000000 00000001)

所以输出 -1 > 1

示例2

int main()
{
	   //strlen函数返回值是unsigned int 类型
	if (strlen("abc") - strlen("abcdef") > 0)
		printf(">");
	else
		printf("<");
}

输出 >

#include<stdio.h>
#include<assert.h>
int my_strlen(const char* str)
{
	assert(str);
	int count = 0;
	while (*str)
	{
		str++;
		count++;
	}
	return count;
}
int main()
{
	
	if (my_strlen("abc") - my_strlen("abcdef") > 0)
		printf(">");
	else
		printf("<");
}

输出<

对于strlen函数中3-6>0,因为strlen函数返回值为unsigned int类型,与0比较大小,进行算数转换,将-3视为unsigned类型(方法与上述类似)必然大于0。

而my_strlen函数中3-6<0,自定义的该函数返回值为int类型,3-6=-3,-3与0两数类型相同故3-6<0。


感谢您的阅读

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值