精华内容
下载资源
问答
  • 2021-04-10 13:24:12

    数据溢出判断与处理的方法

    问题描述

        在诸如LeetCode这些刷题网站中刷题时,题目中常常会出现一个对数据范围的限制要求,比如限制数据范围在(-2^31 ~ 2^31-1)这种,下面的代码是本人处理这种情况的一般方法,如果感觉方法不错,就留下你的赞吧!


    解答方案

    //数据溢出判断与处理样例
    #include"stdio.h"
    #include"math.h"
    #include"stdlib.h"
    void main()
    {
    	unsigned int a;
    	int flag_limit=0,flag_c=0;
    	scanf("%u",&a);
    	if(a<0)
    	{
    		flag_c=1;
    		a=abs(a);
    		a=(unsigned)a;
    	}
    	else
    	{
    		if(flag_c==0)
    		{
    			if(a>pow(2,31)-1)
    			{
    				printf("上限溢出 自动化为:2147483647\n");
    				exit(1);
    			}
    		}
    		else
    		{
    			if(a>pow(2,31))
    			{
    				printf("下限溢出 自动化为:-2147483648\n");
    				exit(1);
    			}
    		}
    	}
    	printf("%u\n",a);
    }
    
    

    代码部分较为简单,因此不做过多解释,如有疑问欢迎评论区留言~

    更多相关内容
  • C语言数据溢出

    千次阅读 2021-11-02 20:01:26
    2、对于signed的整数的溢出C语言的定义是Undefined Overflow,也就是溢出的数正常显示,并不进行求余的运算。例如: signed char x = 0xff printf("%d\n",x); 0xff----> 1111 1111 数在计算机的内存中是以补码的...

    文章目录

    int 类型

    unsigned int num = -1;
    	printf("%u", num);
    

    在这里插入图片描述
    解析:
    首先在寄存器产生一个负数-1,它在计算机中存储的补码是
    32个1,共32个二进制位,当按照赋值号赋给无符号num变量时,符号位变成数值位,所以按照无符号输出为4294967295。

    	short int s = 65535;
    	printf("%d", s);
    
    

    在这里插入图片描述
    解析:
    寄存器产生一个正数65535,故补码是16个1,当按照赋值号赋给有符号的s变量时,最高位变成符号位,则原码100000…001,所以输出-1。

    char

    1、char是一个字节,8bit,我们在采用unsigned char的数据类型的情况下

    如果我们数据产生溢出(超过2^8)
    那么我们最终得到的结果将对2^8(256)取余,如:

    unsigned char x = 0xff;
    x++;
    printf("%d\n",++x);
    

    输出的结果将是1;而不是257.

    2、对于signed的整数的溢出,C语言的定义是Undefined Overflow,也就是溢出的数正常显示,并不进行求余的运算。例如:

    signed char x = 0xff
    printf("%d\n",x);
    

    0xff----> 1111 1111 数在计算机的内存中是以补码的形式存在
    所以此数代表的数是:1000 0001也就是-1,所以输出是-1

    signed char x = 0x7f
    printf("%d\n",++x);
    

    0x7f---->0111 1111 那么该数据先换算成正常的数再执行加1操作(正数的补码是本身),那么加1变成:1000 0000这是-128的补码

    但是我们知道在signed char的数据中一共有8位,并且符号占1位,那么有7位数,所以最大是:0111 1111也就是127,所以128是溢出,所以我们直接显示溢出的那个数,那么上面的代码输出就是-128.

    展开全文
  • c语言 数据溢出时会输出什么

    千次阅读 2021-09-01 09:25:50
    C语言数据具有数据类型属性,数据类型确定了数据所占的内存空间和数据范围 每个数据都会分配相应的存储空间,分配对应的字节,不同的编译器分配的字节偶尔有不同 当int类型会溢出时,可以用long 类型或者long ...

     

     


    前言

    C语言中数据具有数据类型属性,数据类型确定了数据所占的内存空间和数据范围

    每个数据都会分配相应的存储空间,分配对应的字节,不同的编译器分配的字节偶尔有不同

    当int类型会溢出时,可以用long 类型或者long long 类型

    如果超出了分配的范围,系统并不会报错,那么,输出的数字是什么呢?


    一、整型数据常见的存储空间和值的范围

    二、数据转换规则

    原理

    可以将数据存储的范围看做是一个圆环,类似轮回,循环

    如果数据增长到最大值,则数据从最小值方向开始依次递增

    如果数据减到最小值,则数据从最大值方向开始依次递减

    三、数据类型的应用

    1.char -128~127

    如果超过该范围的最大值,正值,那么使用该数值减去2^n  (n是多少bit 1字节=8bit 2字节=16bit),例如200,超过了127,则200-2^8=-56 在该区间内,输出-56

    例如500,超过了127,则500-256=244,不在该区间,继续减去256,244-256=-12,在该区间内,输出-12

    如果超过该范围的最小值,负值,那么使用该数值加上2^n  (n是多少bit 1字节=8bit 2字节=16bit),例如-200,超过了最小值,则-200+2^8=56 在该区间内,输出56

    例如-600,超过了-127,则-600+256=-344,不在该区间,继续+256,-344+256=-88,在该区间内,输出--88

    2.int类型(以4字节为例)

    #include<stdio.h>
    int main()
    {
        int a,b,c,e,f,g,h;//4字节  -2147483648~ 2147483647
        a=2147483647;
        b=2147483648;
        c=2147483649;
        e=8888888888;
        f=-2147483647;
        g=-2147483649;
        h=-8888888888;
        long int x=4294967296 ;
        printf("a=%d\nb=%d\nc=%d\ne=%d\nf=%d\ng=%d\nh=%d\n",a,b,c,e,f,g,h);
        printf("y=%d",b-x);//y=-2147483648
    }
    /*
    a=2147483647   没有超过最大范围,直接输出 
    b=-2147483648   超过最大范围的正数,b-2^32  2^32=4294967296  14行进行验证 
    c=-2147483647     超过最大范围的正数,c-2^32
    e=298954296                8888888888- 4294967296=4593921592  4593921592 仍大于最大值,继续减  4593921592 - 4294967296= 298954296
    f=-2147483647   没有超过最小值,直接输出 
    g=2147483647        超过最小值的负数,加上2^32  
    h=-298954296            超过最小值的负数,+2^32,如果仍不在该区间内,继续加2^32,直到在该区间内 
    */
    

    3.unsigned int(4字节为例)

    C语言中,无符号整型数是不带正负表示符号的整型数。C语言在计算机里编译时数都是用二进制表示的,如果最左边这一位不用来表示正负,而是和后面的连在一起表示整数,那么就不能区分这个数是正还是负,就只能是正数,这就是无符号整型数

    不能用%d输出无符号变量

    #include<stdio.h>
    int main()
    {
    	unsigned int a,b,c,e,f,g,h;//4字节  0-4294967295(2^32-1)
    	a=4294967295;
    	b=4294967296;
    	c=4294967297;
    	e=10000000000;
    	
    	printf("a=%d\nb=%d\nc=%d\ne=%d",a,b,c,e);
    
    }
    
    /*
    a=-1
    b=0
    c=1
    e=1410065408
    主要问题是出在输出控制上,因为你定义的是无符号整数因此16位都用来表示数值,没有符号位
    但是你输出处用%d是不对的
    %d是用来输出有符号整型数的。因此会将b的值以有符号的形式输出。
    而4294967295这个值在32位有符号整数表示中正好是-1.
    */

     

     ②对无符号整型数据用%u格式输出,%u表示用无符号10进制数的格式输出

    #include<stdio.h>
    int main()
    {
    	unsigned int a,b,c,e,f,g,h;//4字节  0-4294967295(2^32-1)
    	a=4294967295;
    	b=4294967296;
    	c=4294967297;
    	e=10000000000;
    	
    	printf("a=%u\nb=%u\nc=%u\ne=%u",a,b,c,e);
    
    }
    
    /*
    a=4294967295
    b=0
    c=1
    e=1410065408
    用%u输出 
    */

    给无符号变量赋一个负值,是会出错的

    #include<stdio.h>
    int main()
    {
        unsigned short price=-1;
        
        printf("%d\n",price);
        printf("%u\n",price);
    
    }
    
    系统对-1先转化为补码形式,也就是全部二进位都是1,然后存入到变量price中
    由于price是无符号短整型变量,左面第一位不代表符号,按%d格式输出,就是65535 (2^16-1)

     

    展开全文
  • C语言中定义的数据类型具有固定大小的存储空间,当定义的数据超过了限度,会出现数据溢出,导致运算结果的不准确。


    前言

    数据类型规定了数据的存储空间,因此计算机中不能存储无穷大和无穷小的数,每种数据类型的数据可以表示一个范围或精度内的数据,如果超出了,就会发生数据溢出,导致无法显示运算结果。


    一、数据类型的精度

    C语言一共提供了6种基本的整型数据类型,有int、short、long,其中每一种加上unsigned构成无符号型。系统分别给相应的变量预留空间分别为2、2、4个字节,每个字节有八位二进制位。有符号整型变量最大只能表示32767;无符号整型变量最大只能表示65535。
    C语言常用的实型常量有float和double型。系统为其变量预留的空间分别是4、8个字节。单精度实型数据有效位数是6~7位,双精度实型数据有效数是15 ~16位。
    C语言中只含有一个字符的类型char,系统预留的存储空间位1个字节,可以表示0~255范围内的数据,超出范围溢出。

    二、程序实例

    代码如下:

    #include <stdio.h>
    void main()
    {
    	int a0,b0;
    	unsigned u1,u2;
    	float a1,a2,b2;
    	double b1;
    	u1=0;
    	a0=32767;
    	b0=a0+1;
    	u2=u1-1;
    	a1=33333.33333;
    	a2=123456.789e5;
    	b2=a2+20;
    	b1=33333.33333333333333333;
    	printf("%d,%d\n",a0,b0);
    	printf("%u,%u\n",u1,u2);
    	printf("%f\n%f\n",a1,b1);
    	printf("%f\n",a2);
    	printf("%f\n",b2);
    }
    

    运行结果:
    数据溢出程序
    结果分析:

    1. 可以看到整型变量a0定义为32767,32767是整型变量的最大限度,当将a0+1赋值给b0,得到b0的值是-32768而不是32768出现了运算错误。
    2. u1,u2均位无符号变量,当给u1设为0值时,u2设为u1-1得到的u2的值不是-1而是65535,可见无符号整型数据无法进行负数类的运算。
    3. 单精度和双精度可以表示的数据的有效数字位6~7和15 ~16位,当赋值的数字超过了范围,输出的数据会被截取。
    4. a2值相当大,所以当将a2的值加20 赋值给b2时,可以看到a2和b2的值是一样的,不是没有运算,是因为20 对于a2的值比较太小可以忽略不计。

    总结

    以上就是今天要讲的内容,本文仅仅简单介绍C语言中数据溢出的实例。

    展开全文
  • [C语言]数据溢出或会发生什么?

    千次阅读 多人点赞 2021-06-07 16:16:58
    C语言数据具有数据类型属性,数据类型确定了数据所占的内存空间和数据范围,那么如果超出了这个数据范围会发生什么情况呢? 比如:char a = 200;wei
  • //例3.3 整型数据溢出 main(){ short a,b;//当前编译器short 分配2字节 int分配4字节 //2字节的存储范围为-32768~32767 a=32767; b=a+2; printf("%d,%d\n",a,b); }
  • C语言编程时,经常遇到整数运算之后的结果超出计算机能表示数据范围,即溢出。请思考如果发生溢出,会产生什么后果?应该如何避免数据溢出
  • 书中说到,使用int型来将两个数的相加,如果结果超过了int型可表示的数值范围,会发生数据溢出,有时候会发生异常。 但使用unsigned型来进行上面的运算时,就不会发生数据溢出,运算的结果=两个数相加后的...
  • int main() {struct sockaddr_in addr, fromAddr;int socketd, linkSocketd, num;size_t size;char readData[1024] = {'\0'};addr.sin_family = AF_INET;addr.sin_port = htons(9900);addr.sin_addr.s_addr = INADDR...
  • C语言中的数据溢出

    万次阅读 多人点赞 2018-09-07 20:40:23
    1、char是一个字节,8bit,我们在采用unsigned char的数据类型的情况下,如果我们数据产生溢出(超过2^8)那么我们最终得到的结果将对2^8(256)取余,如: unsigned char x = 0xff; x++; printf("%d\n",++x)...
  • C语言中的数值溢出

    千次阅读 2020-09-24 16:35:48
    C语言中的数值溢出 当超过一个数据类型能够存放最大的范围时,数值会溢出。 有符号位最高位溢出的区别:符号位溢出会导致数的正负发生改变,但最高位的溢出会导致最高位丢失。 用 char 进行举例 #include <stdio...
  • 通过试验来观察C语言数据溢出现象 #include<stdio.h> int main() { printf("整数溢出举例:"); int a=99999999; printf("%d,%d,%d\n",a,``10*a,100*a); printf("浮点数数据上溢:"); float b=1.2e37; ...
  • C语言编程问题,数据溢出。答案:3信息版本:手机版解决时间 2019-10-06 21:01已解决2019-10-06 03:48#include int main(){int a,n,i=1,k,l,m,p;long j=1;scanf("%d %d",&a,&n);while (i<=n){j*=a;i++;}k=...
  • C语言数据溢出

    2019-06-13 16:22:52
    //得到的结果为num=0,因为这样的整数默认为int类型,在运算阶段4102410241024会发生溢出,结果为0 unsigned long long num=410241024*1024ull;//这样就不会溢出了,int会被提升为unsigned long long类型 下面代码在...
  • 谈谈C语言溢出

    千次阅读 2021-05-24 05:18:20
    3缓冲区溢出 程序在运行过程中,为了临时存取数据的需要,一般都要分配一些内存空间,通常称这些空间为缓冲区。如果向缓冲区写入超过其本身长度的数据,以致于缓冲区无法容纳,就会造成缓冲区以外的存储单元被改写...
  • 另外,整型数据的运算速度比浮点型数据快得多. [注]float类型只能保证7位的有效数字(7位之后都是不准确的), double类型只能保证16位的有效数字(16位之后都是不准确的). [注]如果某个变量用整型来表示就已足够,...
  • 解决整数运算溢出方法——C语言

    千次阅读 2021-05-22 01:54:24
    正如大家所知,在C语言中整型变量用4个字节表示,表示范围略大于2乘以10的9次方,而长整型用8位表示,表示范围略小于2乘以10的19次方。如果所要计算的数字或者计算的中间变量超过整型表示范围,则会出现错误结果,...
  • } 上面所设置的整形和无符号整形均为系统所允许的最大值,下面即是运行的结果: 2147483647 -2147483648 -2147483647 4294967295 0 1 由此可以看出无符号整数 j 像一个汽车里程指示表,当达到最大值时,他将溢出到...
  • C语言数据溢出

    千次阅读 2019-06-04 10:14:21
    C语言数据溢出 想想成一个圆就好了: 以int举例: int i = 32767; i++; //结果是i = -32768; int i = -32768; i--; //结果是i = 32767; unsigned int i = 65535; i++; //结果是i = 0; unsigned int i = 0; i...
  • C语言】--- 数据溢出后的情况

    千次阅读 2020-08-23 09:59:24
    例子1 #include<stdio.h> int main(void) { int i = 2147483647; ... 整形int的取值范围为:-...数据溢出,i++后 i 的值为-2147483648。读者可以自行验证。 例子2 #include<stdio.h> int main.
  • C语言 数据溢出(子序列和)

    千次阅读 2018-07-14 14:25:25
    题目:输入两个正整数 n&lt;m&lt;10^6,输出 1/n^2 + 1/(n+1)^2 + …… + 1/m^2,保留 5 位小数。...陷阱:数据溢出。#include &lt;stdio.h&gt; int main() { int n, m; dou...
  • 整型数据溢出

    2018-11-23 17:42:29
    整型数据的溢出说明。介绍了C语言中关于整型数据溢出的相关知识,适合于初学者的理解应用。
  • C语言溢出错误分析和防范溢出错误是编写程序时比较常见的错误,通过对C语言中栈溢出、堆溢出、BSS溢出(本文共3页)阅读全文>>一、错误分析理论错误分析于20世纪60年代兴起,这一学科的建立归功于Pit Corder。70...
  • C语言溢出计算

    2021-05-22 11:20:43
    类型名称占字节数其他叫法表示的数据范围char1signed char-128 ~ 127unsigned char1none0 ~ 255int4signed int-2,147,483,648 ~ 2,147,483,647unsigned int4unsigned0 ~ 4,294,967,295short2short int-32,768 ~ 32,...
  • 数据溢出 1、程序: #include<stdio.h> #include<limits.h> void main() { unsigned char num = 255; printf("%d", num); printf("\n%d", UCHAR_MAX); printf("\n%d",sizeof(num)); int num1 = 257...
  • 1、当 char ch = 128 或 ch = -0时,则二进制为 1000 0000 计算机内存中都是按负数来处理的 当求补码的时候会溢出,则需要先进行位扩展,变为 1 1000 0000 然后,反码:1 0111 1111 补码:1 1000 ...
  • c语言位域的使用注意事项——数据溢出 c语言可以使用位域来节省变量的空间,例如开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位.位域的取值范围非常有限,数据稍微大些就会发生溢出,这个字使用...
  • C语言的整型数据溢出

    千次阅读 2019-08-21 17:21:29
    本文介绍C语言中的整型数据溢出情况。 示例代码如下: #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int a = 2147483647; int b = 0; char string[35] =...
  • 数据溢出C语言

    2020-03-20 22:54:21
    数据以二进制的形式存储在内存中。 1、正数储存 unsigned char a = 256; printf("a = %d\n",a); 以上代码输出结果为:a = 0 原因:256的二进制形式为:1 0000 0000 而字符型变量在内存中占一个字节。 所以a储存在...
  • C语言溢出错误分析与防范.pdf

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 57,713
精华内容 23,085
关键字:

c语言数据溢出