c语言 数据溢出时会输出什么

 

 


前言

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)

 

  • 14
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值