数据超过类型规定的大小怎么办
C语言中,如果需要用的整数大于int类型的最大值了怎么办?
我们知道int能表示的最大数是2147483647,最小的数是-2147483648,为什么?
因为字32位系统中,寄存器是32位的,寄存器中最高位表示符号位,0表示整数,1表示负数;
所以32位系统中int的最大值可以表示为0111 1111 1111 1111 1111 1111 1111 1111,这个二进制的数就是2147483647
程序示例1:
#include <stdio.h>
int main()
{
int i = 2147483647;
short s = 32767;
printf("i = %d\n",i);
printf("s = %d\n", s);
i = i + 1;
s = s + 1;
printf("i = %d\n", i);
printf("s = %d\n", s);
return 0;
}
输出结果:
i = 2147483647
s = 32767
i = -2147483648
s = -32768
结果是不是很奇怪,最大的数加1之后怎么都有个负号了,不可能,绝对不可能。
但是事实摆在面前了,什么原因?就是因为数据在内存中是怎么存储的问题了,前面说了,数据在内存中存储,默认最高位是符号位,默认存的数据就是有符号的;还有一个原因,正整数在内存中存的是源码,负整数在内存中存的是补码。数据到头之后再加1,你的数据极性就发生了翻转。
也就是说我们写的int ,编译器默认的是signed int;
signed int的数据范围是:-2147483648 ---- 2147483647
我们也可以主动声明数据类型,unsigned int无符号整型,内存里面的32位全部是数据,没有符号位了,那数据的范围就是:0 -- 4294967295
同理也就有了unsigned short、unsigned char。
收到启发,把
程序示例1的代码修改一下,加个unsigned进去
程序示例2:
#include <stdio.h>
int main()
{
unsigned int i = 2147483647; //无符号int
unsigned short s = 32767; //无符号short
printf("i = %d\n",i);
printf("s = %d\n", s);
i = i + 1;
s = s + 1;
printf("i = %d\n", i);
printf("s = %d\n", s);
return 0;
}
输出的结果感觉还是错的,
i = 2147483647
s = 32767
i = -2147483648
s = 32768
而且是short的数据是对的,int的数据是错的,怎么回事?
这是因为打印出了问题,我们打印的格式是%d,默认还是有符号的整型,那为什么short类型的数据是对的呢,因为short数据太小了,内存里面存数据是32位的,short类型数据还没有溢出。
程序需要进一步修改,打印数据类型改为%u,就是输出无符号整型了,
程序示例3:
#include <stdio.h>
int main()
{
unsigned int i = 2147483647;
unsigned short s = 32767;
printf("i = %d\n",i);
printf("s = %d\n", s);
i = i + 1;
s = s + 1;
printf("i = %u\n", i); //打印数据类型是%u
printf("s = %d\n", s);
return 0;
}
输出的结果终于正常了
i = 2147483647
s = 32767
i = 2147483648
s = 32768
在单片机开发中,无符号的整型用得比较多。
数据在内存中的表现
char 占一个字节 数据范围 -128--127
short 占两个字节 数据范围 -32768--32767
int 占4个字节 数据范围 -2147483648 ---- 2147483647
要想知道变量或者类型所占用的内存大小,也就是占用几个字节,可以使用sizeof函数来查询,用法如下:
sizeof(变量);
sizeof(类型);
sizeof 变量;
程序示例4:
#include <stdio.h>
int main()
{
int s = sizeof(short);//short 类型占2个字节,s=2;
int n = sizeof s;
printf("s = %d\n", s); //s的值是2,类型是int
printf("n = %d\n", n); //n的值是4,
return 0;
}
输出结果:
s = 2
n = 4
把常见的类型所占内存的情况都可以打印出来看看
程序示例5:
#include <stdio.h>
int main()
{
printf("char类型变量占用 %d个字节\n", sizeof(char));
printf("short类型变量占用 %d个字节\n", sizeof(short));
printf("int类型变量占用 %d个字节\n", sizeof(int));
printf("float类型变量占用 %d个字节\n", sizeof(float));
printf("double类型变量占用 %d个字节\n", sizeof(double));
return 0;
}
输出结果:
char类型变量占用 1个字节
short类型变量占用 2个字节
int类型变量占用 4个字节
float类型变量占用 4个字节
double类型变量占用 8个字节
程序示例6:
#include <stdio.h>
int main()
{
printf("无符号char类型变量占用 %d个字节\n", sizeof(unsigned char));
printf("无符号short类型变量占用 %d个字节\n", sizeof(unsigned short));
printf("无符号int类型变量占用 %d个字节\n", sizeof(unsigned int));
return 0;
}
输出结果:
无符号char类型变量占用 1个字节
无符号short类型变量占用 2个字节
无符号int类型变量占用 4个字节
以上说明无符号整数与有符号整数所占的内存是一样的。
奇怪的数据类型
有short就有long,但是这个long在不同的编译器里面结果却是不一样的
long一般是占4个字节,但也可能占8个字节;
还用奇葩的类型,long long,也就是long long int的简写,占8个字节;
程序示例7:文章来源:https://www.toymoban.com/news/detail-700122.html
#include <stdio.h>
int main()
{
printf("long类型变量占用 %d个字节\n", sizeof(long));
printf("long long类型变量占用 %d个字节\n", sizeof(long long));
return 0;
}
输出结果:文章来源地址https://www.toymoban.com/news/detail-700122.html
long类型变量占用 4个字节
long long类型变量占用 8个字节
到了这里,关于C语言学习:8、深入数据类型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!