C语言入门系列:数据类型之整数

文章目录

  • 一,简介
  • 二,整数的符号
    • 1,有符号整数
    • 2,无符号整数
    • 3,char表示整数的特殊性
  • 三,整数的子类型
    • 1,三种子类型
    • 2,定义整形的最佳实践
  • 四,整数类型的极限值
  • 五,整数的进制
    • 1,十进制
    • 2,八进制
    • 3,十六进制
    • 4,二进制
    • 5,混合整形表达式
    • 6,占位符

一,简介

整数类型用来表示整数,类型声明使用int关键字。

int num;

上面示例声明了一个整数变量num。

根据C语言标准,int类型至少要有16位(即至少能表示-32767到32767之间的整数)。

大多数现代计算机上,int通常是32位的,不过16位或64位也有可能使用,这种灵活性会导致程序在不同计算机间移植时的兼容性问题。

下面是三种不同位数的整数可以表示的范围。

16位:-32,768 到 32,767。(速记:3万)
32位:-2,147,483,648 到 2,147,483,647。(速记:21亿)
64位:-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。(速记:900兆,一兆等于一亿亿)

从上可以看出,在64位int计算机上运行的程序,移植到16位int的计算机上,可能出现数据溢出,导致程序运行异常。

在这里插入图片描述

怎么解决整形宽度不固定的问题呢?可以先思考下,后续会给出解决方案。

还有,C语言标准为什么不固定整形宽度呢,比如像Java一样,把整形固定为32位?

二,整数的符号

C 语言的整数分为有符号整数无符号整数

  • 有符号整数,使用signed关键字,表示一个类型是有符号的,包含负值。
  • 无符号整数,使用unsigned关键字,表示该类型是无符号的,只能表示零和正整数。

1,有符号整数

C语言标准规定,int类型默认是有符号的,int等同于signed int,为了间接,关键字signed可以省略不写,或者省略int,用signed表示int。

signed int a;
// 等同于
int a;
// 等同于
signed a;

2,无符号整数

无符号只表示非负整数,定义这类整数时,必须使用关键字unsigned。

unsigned int a;

整数变量声明为unsigned的好处是,同样长度的内存能够表示的最大整数值,增大了一倍。

比如,16位的signed int最大值为32,767,而unsigned int的最大值增大到了65,535。

unsigned int里面的int可以省略,所以上面的变量声明也可以写成下面这样。

unsigned a;

3,char表示整数的特殊性

字符类型char在内存中的宽度是8位,可以用来表示较小范围的整数,也可以设置signed和unsigned。

signed char c; // 范围为 -128 到 127
unsigned char c; // 范围为 0 到 255

注意,C语言标准规定int类型默认是有符号的,但char类型表示整数时无此规定,不同计算机可能有不同实现。这就是说,char可能是signed char,也有可能是unsigned char。

所以在用char存储整数时,一般要明确指定是否有符号。

三,整数的子类型

如果int类型使用4个或8个字节表示一个整数,对于小整数,这样做很浪费空间。

另一方面,某些场合需要更大的整数,8个字节还不够。

为了解决这些问题,C 语言在int类型之外,又提供了三个整数的子类型。

1,三种子类型

子类型有利于更精细地限定整数变量的范围,也有利于更好地表达代码的意图。

  • ① short int(简写为short):占用空间不多于int,一般占用2个字节(整数范围为-32768~32767)。
  • ② long int(简写为long):占用空间不少于int,至少为4个字节。
  • ③ long long int(简写为long long):占用空间多于long,至少为8个字节。
short int a;
long int b;
long long int c;

上面代码分别声明了三种整数子类型的变量。

默认情况下,short、long、long long都是带符号的(signed),即signed关键字省略了。

它们也可以声明为不带符号(unsigned),使得能够表示的最大值扩大一倍。

unsigned short int a;
unsigned long int b;
unsigned long long int c;

C 语言允许省略int,所以变量声明语句也可以写成下面这样。

short a;
unsigned short a;

long b;
unsigned long b;

long long c;
unsigned long long c;

2,定义整形的最佳实践

由于C语言标准没有确定整数类型的字节大小,所以在使用时应该根据实际情况进行评估,选择合适的类型,既保证数据类型的安全性即不溢出,又不浪费空间。

  • 需要32位整数时,应使用long类型,可以确保不少于4个字节。
  • 需要64位的整数时,应该使用long long类型,可以确保不少于8个字节。
  • 只需要16位整数时,应使用short类型。
  • 需要8位整数时,应该使用char类型。

四,整数类型的极限值

有时候需要查看,当前系统不同整数类型的最大值和最小值,C 语言的头文件limits.h提供了相应的常量,比如SCHAR_MIN代表 signed char 类型的最小值-128,SCHAR_MAX代表 signed char 类型的最大值127。

下面列举了不同整形的最大最小值常量符号。

SCHAR_MIN,SCHAR_MAX:signed char 的最小值和最大值。
SHRT_MIN,SHRT_MAX:short 的最小值和最大值。
INT_MIN,INT_MAX:int 的最小值和最大值。
LONG_MIN,LONG_MAX:long 的最小值和最大值。
LLONG_MIN,LLONG_MAX:long long 的最小值和最大值。
UCHAR_MAX:unsigned char 的最大值。
USHRT_MAX:unsigned short 的最大值。
UINT_MAX:unsigned int 的最大值。
ULONG_MAX:unsigned long 的最大值。
ULLONG_MAX:unsigned long long 的最大值。

五,整数的进制

1,十进制

C 语言的整数默认都是十进制数,如果要表示八进制数和十六进制数,必须使用专门的表示法。

2,八进制

八进制使用0作为前缀,比如017、0377。

int a = 012; // 八进制,相当于十进制的10

3,十六进制

十六进制使用0x或0X作为前缀,比如0xf、0X10。

int a = 0x1A2B; // 十六进制,相当于十进制的6699

4,二进制

非标准格式,有些编译器使用0b前缀,表示二进制数,有些编译无法直接定义二进制形式的整数。

int x = 0b101010;

注意,不同的进制只是整数的书写方法,同一个整数的不同进制形式上不一样,但实际存储都是以二进制形式存储。

5,混合整形表达式

不同进制可以混合使用,比如10 + 015 + 0x20是一个合法的表达式。

int main()
{
    signed x = 10 + 015 + 0x20;
    
    printf("十进制dec = %d\n", x); // 100
    printf("八进制octal = %o\n", x); // 144
    printf("十六进制hex = %x\n", x); // 64
    printf("带符号的八进制octal = %#o\n", x); // 0144
    printf("带符号的十六进制hex = %#x\n", x); // 0x64
    printf("带符号的十六进制hex = %#X\n", x); // 0X64

    return 0;
}

在这里插入图片描述

6,占位符

printf()的进制相关占位符如下。

%d:十进制整数。
%o:八进制整数。
%x:十六进制整数。
%#o:显示前缀0的八进制整数。
%#x:显示前缀0x的十六进制整数。
%#X:显示前缀0X的十六进制整数。

int x = 100;
printf("dec = %d\n", x); // 100
printf("octal = %o\n", x); // 144
printf("hex = %x\n", x); // 64
printf("octal = %#o\n", x); // 0144
printf("hex = %#x\n", x); // 0x64
printf("hex = %#X\n", x); // 0X64

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

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

相关文章

multiprocessing多进程计算及与rabbitmq消息通讯实践

1. 需求与设计 我所设计的计算服务旨在满足多个客户对复杂计算任务的需求。由于这些计算任务通常耗时较长且资源消耗较大,为了优化客户体验并减少等待时间,我采取了并行计算的策略来显著提升计算效率。 为实现这一目标,我计划利用Python的m…

微信小程序毕业设计-“黄师日报”平安系统项目开发实战(附源码+论文)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计…

奔驰EQS SUV升级原厂主动式氛围灯效果展示

以下是一篇关于奔驰 EQs 升级原厂主动氛围灯案例的宣传文案: 在汽车科技不断演进的今天,我们自豪地为您呈现奔驰 EQs 升级原厂主动氛围灯的精彩案例。 奔驰 EQs,作为豪华电动汽车的典范,其卓越品质与高端性能有目共睹。而此次升…

定义多个类对象,分别输入和输出各对象中的时间(时:分:秒)

在前面的文章中,类中只有公用数据而无成员函数,而且只有1个对象。可以直接在主函数中进行输入和输出。若有多个对象,需要分别引用多个对象中的数据成员,可以写出如下程序: (1)编写程序&#xff…

流程控制相关

1.break语句 只能用在循环体内,用来结束当前循环 语法: while 循环条件表达式: 语句块 if 条件表达式: break 语句块 for i in 迭代对象: 语句块 if 条件表达式: break 语句块 小练: 求一…

WPS相同字体但是部分文字样式不一样解决办法

如下图,在使用wps编辑文档的时候发现有些电脑的文字字体很奇怪,但是把鼠标移到这个文字的位置,发现它和其他正常文字的字体是一样的,都是仿宋_GB2312 正常电脑的文字如下图所示 打开C:\Windows找到Fonts这个文件夹 把仿宋_GB2312这…

MySQL 死锁查询和解决死锁

来了来了来了!客户现场又要骂街了,你们这是什么破系统怎么这么慢啊?!?! 今天遇到了mysql死锁,直接导致服务器CPU被PUA直接GUA了! 别的先别管,先看哪里死锁,或…

使用Mixamo极简绑骨,导入unity中使用

如果你只想专注于角色建模,对于动画设计没有过多精力;如果你想白嫖别人的角色动画,用到自己的模型上;那么,这个网站很适合你:https://www.mixamo.com/ 操作步骤: 首先将自己的模型上传到这个网…

如何混淆 net core 8 架构 C# 编译程序

如何混淆 net core 8 架构 C# 编译程序 一、使用混淆工具 .NET Reactor V6.9二、net core 8 架构 C# 编译程序(发布的单文件)1、通过发布的单文件程序,可以直接在 .NET Reactor 拖入或打开 ,勾选自己需要的保护功能。2、勾选自己需…

SHA256 安全散列算法加速器实验

1、SHA256 介绍 SHA256 加速器是用来计算 SHA-256 的计算单元, SHA256 是 SHA-2 下细分出的一种算法。 SHA-2 名称来自于安全散列算法 2 (英语: Secure Hash Algorithm 2 )的缩写,一种密码散列函 数算法标准…

群辉NAS中文件下载的三种方案

目录 一、迅雷套件 1、添加套件来源 2、安装套件 3、手机安装迅雷 二、qBittorrent套件 1、添加套件来源 2、改手工安装 3、更新后的问题 4、最后放弃DSM6 (1)上传文件手工安装 (2)添加套件来源 5、解决登陆报错 6、添加tracker 7、修改下载默认位置 8、手机…

经验总结--开关MOS管发热的一般原因/电源开发经验总结

开关MOS管发热的一般原因 做电源设计,或者做驱动方面的电路,难免要用到场效应管,也就是人们常说的MOS管。MOS管有很多种类,也有很多作用。做电源或者驱动的使用,当然就是用它的开关作用。 无论N型或者P型MOS管,其工作原理本质是一样的。MOS管是由加在输入端栅极的电压来控…

C#委托:事件驱动编程的基石

目录 了解委托 委托使用的基本步骤 声明委托(定义一个函数的原型:返回值 参数类型和个数) 根据委托定义的函数原型编写需要的方法 创建委托对象,关联“具体方法” 通过委托调用方法,而不是直接使用方法 委托对象所关联的方…

Electron快速入门(三):在(二)的基础上修改了一个文件夹做了个备忘录

Lingering Memories 诗绪萦怀 修改index.html <!--index.html--> <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8"><!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP --><meta h…

一种简单的图像分析

简介 一种简单的边界分析&#xff0c;通过相邻的像素的灰度进行判断&#xff0c;计算出边界。 测试1 原图 结果 测试2 原图 结果 代码说明 主要的技术在makeTable过程中&#xff0c;这个过程主要执行了以下几步 计算每个像素的灰度计算相邻多个像素的最大灰度差统计灰度差…

【IC验证】UVM实验lab03

1. TLM端口的创建、例化与使用 创建&#xff1a; uvm_get_blocking_port #(fmt_trans) mon_bp_port; 例化&#xff1a; function new(string name "mcdf_refmod", uvm_component parent);super.new(name, parent);fmt_trans new("fmt_trans", this);…

程序猿大战Python——面向对象——魔法方法

什么是魔法方法&#xff1f; 目标&#xff1a;了解什么是魔法方法&#xff1f; 魔法方法指的是&#xff1a;可以给Python类增加魔力的特殊方法。有两个特点&#xff1a; &#xff08;1&#xff09;总是被双下划线所包围&#xff1b; &#xff08;2&#xff09;在特殊时刻会被…

MySQL进阶——视图

目录 1基本语法 1.1创建 1.2 查询 1.3 修改 1.4 删除 2 检查选项 2.1 级联CASCADED 2.2本地LOCAL 3 更新及作用 3.1视图的更新条件 3.2视图的作用 4视图案例 1基本语法 视图&#xff08;View&#xff09;是一种虚拟存在的表。视图中的数据并不在数据库中实际存在&…

YYU-5/80-260mm型钢筋残余变形测试仪 电子引伸计

YYU-5/80-260mm型钢筋接头专用引伸计&#xff0c;是按照《JGJ 107 2010 钢筋技术连接技术规程》的技术要求设计的&#xff0c;专门用于测试钢筋接头残余变形的双向平均引伸计&#xff0c;其标距可以根据钢筋直径要求进行调整。 完全符合《JGJ 107 2010 钢筋技术连接技术规程》…

Java 超详细实现导入导出 (包含时间转换问题和样式)

序言 工作中遇到了导入导出问题&#xff0c;并且出现了导入或导出Excel时间格式变为数字的问题。通过学习解决实现了这些功能&#xff0c;记录总结分享给大家。本文将详细介绍如何使用 Java 编程语言和 Apache POI 库来实现这些功能。我们将通过一个示例项目演示如何从数据库中…