目录
*注意事项
前言
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)