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

这篇具有很好参考价值的文章主要介绍了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; //无符号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:

#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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言入门教程,C语言学习教程(第三部分:C语言变量和数据类型)二

    前面我们多次提到了字符串,字符串是多个字符的集合,它们由 \\\" \\\" 包围,例如 \\\"http://c.biancheng.net\\\" 、 \\\"C语言中文网\\\" 。字符串中的字符在内存中按照次序、紧挨着排列,整个字符串占用一块连续的内存。 当然,字符串也可以只包含一个字符,例如 \\\"A\\\" 、 \\\"6\\\" ;不过为了操作方

    2024年01月17日
    浏览(40)
  • 【JAVA】数据类型与变量(主要学习与c语言不同之处)

    ✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:橘橙黄又青-CSDN博客 目标: 1. 字面常量 2. 数据类型 3. 变量 在上节课 HelloWorld 程序中, System.Out.println(\\\"Hello World\\\") ; 语句,不论程序何时运行,输出的都是 Hello World,其实 \\\"Hello Wo

    2024年03月28日
    浏览(33)
  • 学习笔记-数据查询语言DQL

    1.基本语法 2.数据准备 3.简单查询 4.条件查询 (1)比较查询 (2).范围查询 (3).逻辑查询 (4).模糊查询 (5).非空查询 5.排序查询 ASC 升序 (默认) DESC 降序 6.聚合查询 7.分组查询 having与where的区别: 1).having是在分组后对数据进行过滤,where是在分组前对数据进行过滤 2).having后面可以使用分

    2024年02月02日
    浏览(49)
  • 100天精通Golang(基础入门篇)——第5天: Go语言中的数据类型学习

    🌷 博主 libin9iOak带您 Go to Golang Language.✨ 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批

    2024年02月08日
    浏览(36)
  • 【大数据】Hive SQL语言(学习笔记)

    1)数据库结构 默认的数据库叫做default,存储于HDFS的:/user/hive/warehouse 用户自己创建的数据库存储位置:/user/hive/warehouse/database_name.db 2)创建数据库 comment:数据库的注释说明语句 location:指定数据库在HDFS存储位置,默认/user/hive/warehouse/dbname.db with dbproperties:用于指定一些数

    2024年02月07日
    浏览(34)
  • R语言学习笔记--列表list、数据框

    1-列表 列表 可以包含不同类型的 对象 ,也就是说,列表不是将某些具体的值组织起来,而是组织R对象。列表将数据组织在一个一维集合中。 列表非常好用,因为它可以装任何类型的对象,不要求数据之间是同质的。 创建列表 list()  以上代码,创建了一个列表,其中第一个

    2024年02月15日
    浏览(35)
  • R语言学习笔记之数据清洗与整理(三)

    提高 1.查看数据前三行 head(df,3)或 slice_head(n=3) 2.查看每列数据缺失情况 is.na(df)#适用于小数据 sum(is.na()) table(is.na())#只能知道缺失值的个数并不知道每一列(即每个变量)缺失数据的情况 (1)miss-function(x){sum(is.na(x)/length(x)*100)} apply(数据集,2,rate)#2是按列算rate的意思 (2)libr

    2023年04月19日
    浏览(27)
  • 【教程】MySQL数据库学习笔记(三)——数据定义语言DDL(持续更新)

    写在前面: 如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持! 第一章 《认识与环境搭建》 第二章 《数据类型》 第三章 《数据定义语言DDL》 DDL(Data Definition Language,数据定义语言) 是用于定义和管理数据库对象(如表、视图、索引等

    2024年02月20日
    浏览(32)
  • 数据结构(c++语言版) 邓俊辉 第五章:二叉树学习笔记

    5.1二叉树及其表示         树是由节点和边组成的。 1.有根树         树是由顶点(vertex)和边(edge)组成。树的每个顶点也叫节点(node)。 2.深度与层次         由树的连通性,每一节点与根都有一条路径相连:根据树的无环性,由根通往每个节点的路径必然唯一。  

    2024年02月13日
    浏览(33)
  • 【数据库·关系数据库标准语言SQL·学习笔记】Microsoft SQL Server数据库的建立和删除

    开发环境:SQL Server Management Studio(SSMS) 利用数据库对象资源管理器创建数据库 (1)右击对象资源管理器中的数据库,选择新建数据库 (2)在新建数据库界面输入数据库名称 ,并选择确定 利用CREAT DATABASE命令在SSM工具的新建查询中创建数据库 1.语法格式 CREATE DATABASE dat

    2024年02月08日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包