当前位置: 首页 > news >正文

C语言学习:8、深入数据类型

数据超过类型规定的大小怎么办

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; //无符号intunsigned short s = 32767; //无符号shortprintf("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); //打印数据类型是%uprintf("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,类型是intprintf("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:

#include <stdio.h>int main()
{printf("long类型变量占用 %d个字节\n", sizeof(long)); printf("long long类型变量占用 %d个字节\n", sizeof(long long));return 0;
}

输出结果:

long类型变量占用 4个字节
long long类型变量占用 8个字节

http://www.lryc.cn/news/162317.html

相关文章:

  • 生成树协议 STP(spanning-tree protocol)
  • 【LeetCode】312.戳气球
  • 商业数据分析概论
  • Golang GUI框架
  • LeetCode刷题笔记【24】:贪心算法专题-2(买卖股票的最佳时机II、跳跃游戏、跳跃游戏II)
  • 游戏出现卡顿有哪些因素
  • 学习Bootstrap 5的第八天
  • vue中自定义指令
  • Python:安装Flask web框架hello world
  • 小程序点击复制功能制作
  • 20230909java面经整理
  • 常用的css命名规则
  • 【Linux编程Shell自动化脚本】03 shell四剑客(find、sed、grep、awk)
  • java的springboot框架中使用logback日志框架使用RabbitHandler注解为什么获取不到消费的traceId信息?
  • 初探Vue.js及Vue-Cli
  • 大数据课程K21——Spark的SparkSQL基础语法
  • 【实践篇】Redis最强Java客户端(三)之Redisson 7种分布式锁使用指南
  • 卫星通话过后,卫星导航产业被彻底激活
  • 【算法训练-链表 七】【排序】:链表排序、链表的奇偶重排、重排链表
  • LGB的两种写法
  • 【Unity的HDRP下ShaderGraph实现权重缩放全息投影_(内附源码)】
  • 透视俄乌网络战之二:Conti勒索软件集团(上)
  • 【华为OD机试python】拔河比赛【2023 B卷|100分】
  • 05 CNN 猴子类别检测
  • 【C#】关于Array.Copy 和 GC
  • Vue前端框架08 Vue框架简介、VueAPI风格、模板语法、事件处理、数组变化侦测
  • WebStorm使用PlantUML
  • Python做批处理,给安卓设备安装应用和传输图片
  • 如何获取springboot中所有的bean
  • 大数据技术之Hadoop:HDFS存储原理篇(五)