09C语言——数值溢出、混合赋值、无符号数在c语言中陷阱

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

一、数值溢出

概念:当一个数据类型超过它存储的范围就会发生数据溢出问题

二、混合赋值

1.短类型给到长类型

随便转;因为大的数据类型比小的数据类型范围要大。
double = int;int = short;short = char;
代码:

#include <stdio.h>
int main(int argc, const char *argv[])
{
	int a = 10;
	double b;
	//短类型给长类型
	b = a ;
	printf("b = %f\n", b);
	return 0;
}

结果:
在这里插入图片描述

2.整形转浮点型或者float转double

会导致精度丢失
float = double ; int= double;

3.长类型给到短类型

高位截断;
short = int; char = int;

#include <stdio.h>
int main(int argc, const char *argv[])
{
	int a = 0x12345678;
	short b = a ;
	char c = a;
	printf("a = %x\n",a);
	printf("b = %x\n",b);
	printf("c = %x\n",c);
	return 0;
}

结果
在这里插入图片描述

4.无符号类型给到有符号类型

代码如下(示例):

int main(int argc, const char *argv[])
{
	//无符号向有符号转换	
	unsigned char a = 0xff;
	char b = a ;
	printf("b = %d\n",b);

运算结果:
在这里插入图片描述
分析:最高位的数据位当成符号位进行计算,已知补码求源码,补码减1取反。
补码:1111 1111
减一:1111 1110
取反:1000 0001
结果:-1

5.有符号类型给到无符号类型

#include <stdio.h>
int main(int argc, const char *argv[])

	//无符号的小类型数据向大类型数据进行转换
	char a = -1;
	unsigned int b = a;
	printf("%#x\n",b);
	printf("%d\n",b);
	return 0;
}

运行结果是:
在这里插入图片描述
分析:
源码:1000 0001
反码:1111 1110
补码; 1111 1111
高位补符号位:0xffff ffff
使用%d打印:实际上是把负一的补码值 解读为了有符号的十进制 所以打印出来是-1

三、无符号数在运算时的陷阱

1.无符号与有符号的算数运算

#include <stdio.h>

void count_unsined()
{
	int a = -10;
	unsigned int b = 7;
	if((a+b) > 0)
	{
		printf("a = %d \n",a);
		printf("b = %d \n",b);
		printf("is change\n");
	}
	else
	{
		printf("not change\n");
	}
}
int main(int argc, const char *argv[])
{
	count_unsined();
	return 0;
}
}

总结:
这说明在c语言操作中,如果遇到无符号数与有符号数之间的操作,编译器会自动转化为无符号数来进行处理。这个也验证了有符号和无符号算术运算操作时会将有符号类型转换为无符号类型来计算。

2.无符号与有符号的比较运算

#include <stdio.h>
void count_unsined()
{
	int a = -10;
	unsigned int b = 7;
	if((a+b) > 0)
	{
		printf("a = %d \n",a);
		printf("b = %d \n",b);
		printf("is change\n");
	}
	else
	{
		printf("not change\n");
	}
}
int main(int argc, const char *argv[])
{
	cmp_unsigned();
	return 0;
}
}

总结:
这说明有符号数和无符号数进行比较运算时(==,<,>,<=,>=),有符号数隐式转换成了无符号数(即底层的补码不变,但是此数从有符号数变成了无符号数),此时的a的值远大于b。

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值