C语言整型数据类型..

1.整型数据类型

在C语言中 根据数据范围从小到大依次为char、short、int、long、long long
但是对于整型来说 为什么有这么多类型呢
我们得先说字节的本质:
计算机是通过晶体管的开关状态来记录数据 晶体管通常8个为一组 称为一个字节 而晶体管由两种状态 分别是开和关两种状态 一个字节有8个晶体管 所以对应256(2 ^ 8)种状态 每一种状态对应一种数值 所以一个字节可以表示256个数值
在发明C语言的时代 晶体管资源是十分稀缺的 如果想要表示一个0~100的数据 可以用一个字节的类型去表示 何必用两个字节去表示呢
而C语言作为一门强类型语言 他势必要提供类型丰富的数据类型供我们选择 而且我们就算到了现在依然也沿袭了以前的传统 就是用合适的类型装载合适的数据 这(挑选合适的语言)也要求这门语言提供丰富类型的必要性
接下来 我们肯定想要知道C语言中不同类型所占用的字节数 其实这个在C标注中并没有明确规定
他是由不同的编译器和平台有着不同的数据 我们具体可以利用sizeof进行指定类型大小的获取

2.sizeof

我们可以使用sizeof测量各种实体的大小
如果我们在prinf函数中将sizeof作为替换的话 那么对应的占位可以是%d 但是更准确的是%zu
sizeof具体测量的对象可以是:
类型、变量、常量 测量的是指定类型或者指定变量类型或者指定常量类型所占用的字节数

int main(){
    int a = 10;
    printf("%zu\n", sizeof(int));// 4
    printf("%zu\n", sizeof(a));// 4
    printf("%zu\n", sizeof(10));// 4
    return 0;
}

我们也可以来看一下在clion中C语言每一种整型类型占用的字节数

int main(){
    printf("%zu\n", sizeof(char));// 1
    printf("%zu\n", sizeof(short));// 2
    printf("%zu\n", sizeof(int));// 4
    printf("%zu\n", sizeof(long));// 4
    printf("%zu\n", sizeof(long long));// 8
    return 0;
}

C标准虽然没有明确规定各种整形类型占用的字节数 但是他规定了高级别的取值范围不得小于低级别的取值范围 这对于任何的编译器和平台都需要遵守

3.三位二进制位的取值范围

我们前面讲了 一个字节对应了8个晶体管 一个晶体管对应了两种状态 一个字节对应了2 ^ 8个状态 即256种状态 一种状态对应了一个数值 所以一个字节对应了256个数值
但是我们知道了一个字节对应的数值个数 但是却不清楚具体的数值范围 所以现在我们就来分析一下
由于8位二进制位分析起来属实有点麻烦 所以我们将分析的对象设置为三位二进制位
按照之前的理论 三位二进制位对应了8个数值 但是具体对应的是那八个数值呢
先说结论 0-7
如果不考虑负数的话 那么三位二进制位对应的数值就是0-(2 ^ n) - 1(n表示二进制位的位数)
晶体管的开关状态 二进制 十进制
关关关 000 0
关关开 001 1
关开关 010 2
关开开 011 3
开关关 100 4
开关开 101 5
开开关 110 6
开开开 111 7
但如果要考虑负数的话 我们首先需要来了解一下闹钟理论
一个闹钟一共有12个间隔 每走一个间隔相当于走过一个整点 分别对应12种不同的模式 我们称之为闹钟的模
现在如果想从5点走到12点/0点的话 那么有两种走法 一种是向前走7步 即5 + 7 一种是向后走5步 即5 - 5
第一种走法用公式概括为当前时间 + (闹钟的模 - 当前时间)
第二种走法用公式概括为当前时间 - 当前时间
两种走法都可以达到同样的效果 因此我们可以知道(闹钟的模 - 当前时间)等价于-当前时间

这种做法在二进制中我们称之为用加法等效减法的二进制表示法 即补码表示法 二进制中模为8 即代表8种状态
正数对应的补码就是其自身
正数对应的负数的补码就是(模 - 正数)的二进制
所以如果考虑了负数的话 那么三位二进制位中每一种状态的数值分别是:
(那么就将最高位设置为符号位 不参与数值位的计算 最高位为0时 数值为正 最高位为1时 数值为负)
晶体管的状态 二进制 十进制
关关关 000 0
关关开 001 1
关开关 010 2
关开开 011 3
开关关 100 -4(二进制为(8 - 4)的二进制 所以这个负数为-4)
开关开 101 -3(二进制为(8 - 3)的二进制 所以这个负数为-3)
开开关 110 -2(二进制为(8 - 2)的二进制 所以这个负数为-2)
开开开 111 -1(二进制为(8 - 1)的二进制 所以这个负数为-1)

还有一点需要说明的是 我们在利用二进制做加减法的时候 用多少位进行储存 结果就用多少位进行表示 比如3 + (-3) = 0
011

  • 101

1000
由于结果是用三位进行储存 所以只能用三位表示 将最高位抛弃 即000 所以结果是为0
补码还有第二种表示方法:
正数依然等于本身
只不过正数对应的负数的补码的获取方式不一样 其具体方法为:
1.先写出负数对应的正数的二进制
2.遇到第一个1之前全部填0
3.遇到第一个1时 填1
4.遇到第一个1之后 取反
我们在用这个方法来处理三位二进制位中每一个状态下的二进制和十进制分别是什么
晶体管开关状态 二进制 十进制
关关关 000 0
关关开 001 1
关开关 010 2
关开开 011 3
开关关 100 -4
开关开 101 -3
开开关 110 -2
开开开 111 -1
我们可以总结一下了
如果不考虑负数的话 那么三位二进制位的数值范围是:0 - (2 ^ n) - 1
如果考虑负数的话 那么三位二进制位的数值范围是:-(2 ^ (n - 1)) - (2 ^ (n - 1)) - 1

所以C语言中 各种整数类型数据占用的字节数以及取值范围如下图所示:
在这里插入图片描述
如果你不打算表示负数的话 那么你可以利用unsigned修饰你的整型变量 但是unsigned修饰的整数也有自己的一套取值范围
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/384413.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

交叉熵损失函数(Cross-Entropy Loss)的基本概念与程序代码

交叉熵损失函数(Cross-Entropy Loss)是机器学习和深度学习中常用的损失函数之一,用于分类问题。其基本概念如下: 1. 基本解释: 交叉熵损失函数衡量了模型预测的概率分布与真实概率分布之间的差异。在分类问题中&…

春节假期:思考新一年的发展思路

春节假期是人们放松身心、享受家庭团聚的时刻,但除了走亲戚、玩、吃之外,我们确实也需要思考新的一年的发展思路。以下是一些建议,帮助您在春节假期中为新的一年做好准备: 回顾过去,总结经验:在春节期间&a…

大华智慧园区综合管理平台/emap/devicePoint RCE漏洞

免责声明:文章来源互联网收集整理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…

【十六】【C++】stack的常见用法和练习

stack的常见用法 C标准库中的stack是一种容器适配器,它提供了后进先出(Last In First Out, LIFO)的数据结构。stack使用一个底层容器进行封装,如deque、vector或list,但只允许从一端(顶部)进行…

一周学会Django5 Python Web开发-Django5操作命令

锋哥原创的Python Web开发 Django5视频教程: 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计11条视频,包括:2024版 Django5 Python we…

第8讲个人中心页面搭建实现

个人中心页面搭建实现 <template><view class"user_center"><!-- 用户信息开始 --><view class"user_info_wrap"><!--获取头像--><button class"user_image"></button> <view class"user_n…

14.盔甲?装甲?装饰者模式!

人类的军工发展史就是一场矛与盾的追逐&#xff0c;矛利则盾坚&#xff0c;盾愈坚则矛愈利。在传统的冶金工艺下&#xff0c;更坚固的盾牌和盔甲往往意味着更迟缓笨重的运动能力和更高昂的移动成本。从战国末期的魏武卒、秦锐士&#xff0c;到两宋之交的铁浮图、重步兵&#xf…

Roop的安装教程

roop插件的安装&#xff0c;并不容易 并且最好就是在电脑本地完成&#xff0c;因为涉及到C、visual studio软件&#xff0c;并且还需要在电脑本地放置一些模型&#xff0c;用autoDL其实也有镜像&#xff0c;但是需要数据扩容至少100G&#xff0c;烧钱。。。 电脑本地&#xff0…

javaweb物业管理系统jsp项目

文章目录 物业管理系统一、系统演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目源码&#xff08;9.9&#xffe5;带走&#xff09; 物业管理系统 可用作javaweb项目、servlet项目、jsp项目的项目设计 一、系统演示 物业管理系统 二、项目介绍 语言&a…

ChatGPT高效提问—prompt常见用法(续篇)

ChatGPT高效提问—prompt常见用法&#xff08;续篇&#xff09; ​ 对话式prompt适用于模拟各种交流情境。若我们意图探索在特殊场合下可能出现的对话情景&#xff0c;或者模拟一段对话流程&#xff0c;可以采用这种方法&#xff0c;通过精准的prompt指令&#xff0c;引导Chat…

多视图特征学习 Multi-view Feature Learning既可以被看作是一种学习框架,也可以被看作是一种具体的学习算法!

Multi-view Feature Learning 1.多视图特征学习Multi-view Feature Learning的基本介绍总结 1.多视图特征学习Multi-view Feature Learning的基本介绍 多视图特征学习是一种利用多视图数据集来进行联合学习的机器学习方法。多视图数据指的是对同一事物从多种不同的途径或角度进…

监测Nginx访问日志502情况后并做相应动作

今天带大家写一个比较实用的脚本哈 原理&#xff1a; 假设服务器环境为lnmp&#xff0c;近期访问经常出现502现象&#xff0c;且502错误在重启php-fpm服务后消失&#xff0c;因此需要编写监控脚本&#xff0c;一旦出现502&#xff0c;则自动重启php-fpm服务 场景&#xff1a; 1…

人脸追踪案例及机器学习认识

1.人脸追踪机器人初制 用程序控制舵机运动的方法与机械臂项目完全相同。 由于摄像头的安装方式为上下倒转安装&#xff0c;我们在编写程序读取图像时需使用 flip 函数将 图像上下翻转。 现在&#xff0c;只需要使用哈尔特征检测得到人脸在图像中的位置&#xff0c;再指示舵机运…

C++内联函数深入讲解

用法&#xff1a; 在函数的返回值前面加上inline&#xff0c;例如&#xff1a; 作用&#xff1a; 内联函数的存在其实是为了解决c语言中一些问题&#xff0c;比如有一个频繁调用的小函数&#xff0c;每次调用都需要建立栈帧&#xff0c;压栈出栈&#xff0c;减少了效率&#xf…

【复现】litemall商场系统后台弱口令漏洞_47

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 litemall是一个简单的商场系统&#xff0c;基于现有的开源项目&#xff0c;重新实现一个完整的前后端项目&#xff0c;包含小程序…

单链表基础知识点

单链表的读取 对于单链表实现获取第i个元素的数据的操作 GetElem&#xff0c;在算法上&#xff0c;相对要麻烦一些。 获得链表第i个数据的算法思路: 声明一个结点p指向链表第一个结点&#xff0c;初始化j从1开始;当j<i时&#xff0c;就遍历链表&#xff0c;让p的指针向后移…

如何通过ETL实现快速同步美团订单信息

一、美团外卖现状 美团作为中国领先的生活服务电子商务平台&#xff0c;其旗下的美团外卖每天承载着大量的订单信息。这些订单信息需要及时入库、清洗和同步&#xff0c;但由于数据量庞大且来源多样化&#xff0c;传统的手动处理方式效率低下&#xff0c;容易出错。比如&#…

嵌入式中详解 ARM 几个常见的寄存器方法

大家好&#xff0c;今天来聊聊对于ARM几个特殊寄存器的理解&#xff0c;FP、SP和LR。 1、介绍 FP&#xff1a;栈顶指针&#xff0c;指向一个栈帧的顶部&#xff0c;当函数发生跳转时&#xff0c;会记录当时的栈的起始位置。 SP&#xff1a;栈指针&#xff08;也称为栈底指针&…

2本对微服务拆分有帮助的书

迁移到云原生应用架构 可在线观看的免费书籍 https://pivotal.io/platform-as-a-service/migrating-to-cloud-native-application-architectures-ebook 微服务架构设计模式 世界十大架构师之一&#xff1a;克里斯理查森著

161基于matlab的快速谱峭度方法

基于matlab的快速谱峭度方法&#xff0c;选择信号峭度最大的频段进行滤波&#xff0c;对滤波好信号进行包络谱分析。输出快速谱峭度及包络谱结果。程序已调通&#xff0c;可直接运行。 161 信号处理 快速谱峭度 包络谱分析 (xiaohongshu.com)
最新文章