C++ 入门(七)— 基本数据类型

文章目录

  • Void
  • 整数
    • 有符号整数
    • 无符号整数
    • 固定宽度的整数和size_t
  • 浮点数
  • 布尔值
  • 字符
  • 类型转换

Void

Void 是最容易解释的数据类型。void = 没有类型

不返回值的函数

最常见的是,void 用于指示函数不返回值:

void writeValue(int x) 
{
    std::cout << "The value of x is: " << x << '\n';
}

如果使用 return 语句尝试在此类函数中返回值,则会导致编译错误:

void noReturn(int x) // void here means no return value
{
    std::cout << "The value of x is: " << x << '\n';
    return 5; // error
}

已弃用:不采用参数的函数

在 C 语言中,void 用于指示函数不采用任何参数:

int getValue(void) // void here means no parameters
{
    int x{};
    std::cin >> x;

    return x;
}

但这种关键字 void 的使用在 C++ 中被视为已弃用。以下代码是等效的,在 C++ 中是首选的:

int getValue() // empty function parameters is an implicit void
{
    int x{};
    std::cin >> x;

    return x;
}

整数

有符号整数

整数是一种整数类型,可以表示正整数和负整数,包括 0(例如 -2、-1、0、1、2)。C++ 有 4 种主要基本整数类型可供使用:

类型最小范围注意
short int16 bits(位)
int16 bits(位)在现代架构上通常为 32 位
long int32 bits(位)
long long int64 bits(位)

定义有符号整数

short s;      // 用short代替short int
int i;
long l;       // 选择“long”而不是“long int”
long long ll; // 选择“long long”而不是“long long int”

整数类型还可以采用可选的 signed 关键字,但是,不应使用此关键字,因为它是多余的,因为默认情况下整数是有符号的。

有符号整数范围

类型范围
8 位有符号-128 ~ 127
16 位有符号-32,768 ~ 32,767
32 位有符号-2,147,483,648 ~ 2,147,483,647
64 位有符号-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

无符号整数

要定义无符号整数,我们使用 unsigned 关键字。按照惯例,它放在以下类型之前:

unsigned short us;
unsigned int ui;
unsigned long ul;
unsigned long long ull;

无符号整数范围

类型范围
8 位有符号0 ~ 255
16 位有符号0 ~ 65,535
32 位有符号0 ~ 4,294,967,295
64 位有符号0 ~18,446,744,073,709,551,615

n 位无符号变量的范围为 0 0 0 ( 2 n ) − 1 (2^n)-1 (2n)1

应该避免使用无符号整数:

  • 首先,对于带符号值,需要做一些工作才能意外溢出范围的顶部或底部,因为这些值远非 0。对于无符号数字,溢出范围的底部要容易得多,因为范围的底部是 0,它接近我们大多数值的位置。
  • 其次,更隐蔽的是,当您混合有符号和无符号整数时,可能会导致意外行为。在 C++ 中,如果数学运算(例如算术或比较)有一个有符号整数和一个无符号整数,则有符号整数通常会转换为无符号整数。因此,结果将是无符号的。

固定宽度的整数和size_t

C99 定义了一组固定宽度的整数(在 stdint.h 标头中),这些整数保证在任何架构上都是相同的大小。

名称类型范围
std::int8_t1 byte signed-128 ~ 127
std::uint8_t1 byte unsigned0 ~ 255
std::int16_t2 byte signed-32,768 ~ 32,767
std::uint16_t2 byte unsigned0 ~ 65,535
std::int32_t4 byte signed-2,147,483,648 ~ 2,147,483,647
std::uint32_t4 byte unsigned0 ~ 4,294,967,295
std::int64_t8 byte signed-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
std::uint64_t8 byte unsigned0 ~ 18,446,744,073,709,551,615

C++ 正式采用这些固定宽度的整数作为 C++11 的一部分。可以通过包含标头来访问它们,标头在 std 命名空间中定义它们。下面是一个示例:

#include <cstdint> // for fixed-width integers
#include <iostream>

int main()
{
    std::int16_t i{5};
    std::cout << i << '\n';
    return 0;
}

_t 后缀
较新版本的 C++ 中定义的许多类型(例如 std::nullptr_t)都使用 _t 后缀。此后缀的意思是“类型”,它是应用于现代类型的常见命名法。
如果您看到带有 _t 后缀的内容,则它可能是一种类型。但许多类型没有_t后缀,因此这并不能始终如一地应用。

固定宽度的整数有两个缺点:

  • 首先,不能保证在所有体系结构上都定义固定宽度的整数。
  • 其次,如果使用固定宽度的整数,则在某些体系结构上,它可能比更宽的类型慢。

浮点数

有三种不同的浮点数据类型:float、double 和 long double。与整数一样,C++ 不定义这些类型的实际大小(但它保证最小大小)。

在现代架构上,浮点表示几乎总是遵循 IEEE 754 二进制格式(由 William Kahan 创建)。在这种格式中,浮点数为 4 个字节,double 为 8 个字节,长 double 可以等效于 double(8 字节)、80 位(通常填充为 12 个字节)或 16 个字节。

浮点数据类型始终是有符号的(可以保存正值和负值)。

类型最小尺寸常用尺寸
float4 bytes4 bytes
double8 bytes8 bytes
long double8 bytes8, 12, or 16 bytes

以下是浮点变量的一些定义:

float fValue;
double dValue;
long double ldValue;

使用浮点运算文本时,请始终至少包含一位小数(即使小数点为 0)。这有助于编译器了解该数字是浮点数而不是整数。

int x{5};      // 5 means integer
double y{5.0}; // 5.0 is a floating point literal (no suffix means double type by default)
float z{5.0f}; // 5.0 is a floating point literal, f suffix means float type

请注意,默认情况下,浮点文本默认为 double 类型。f 后缀用于表示 float 类型的文本。

浮点范围

IEEE 754 表示:
在这里插入图片描述
浮点精度

浮点类型的精度定义了它可以表示多少有效数字而不会丢失信息。

双精度值的精度在 15 到 18 位之间,大多数双精度值至少有 16 位有效数字。Long double 的最小精度为 15、18 或 33 位有效数字,具体取决于它占用的字节数。

浮点类型只能精确地表示一定数量的有效数字。使用有效位数多于最小值的值可能会导致值存储不准确。

NaN 和 Inf

浮点数有两个特殊类别:

  • 第一个是 Inf,它代表无穷大。Inf 可以是正数或负数。
  • 第二个是NaN,代表“不是数字”。

布尔值

布尔变量是只能有两个可能值的变量:true 和 false。

要声明布尔变量,我们使用关键字 bool。

bool b1 { true };
bool b2 { false };
b1 = false;
bool b3 {}; // default initialize to false

整数到布尔值的转换

使用整数初始化变量,初始化bool值:

#include <iostream>

int main()
{
	bool bFalse { 0 }; // okay: initialized to false
	bool bTrue  { 1 }; // okay: initialized to true
	bool bNo    { 2 }; // error: narrowing conversions disallowed

	std::cout << bFalse << bTrue << bNo << '\n';

	return 0;
}

在这里插入图片描述

上面在 bNo 初始化 2 时报错。

但是,整数可以转换为布尔值 :

#include <iostream>

int main()
{
	std::cout << std::boolalpha; // print bools as true or false

	bool b1 = 4 ; // copy initialization allows implicit conversion from int to bool
	std::cout << b1 << '\n';

	bool b2 = 0 ; // copy initialization allows implicit conversion from int to bool
	std::cout << b2 << '\n';


	return 0;
}

在这里插入图片描述

字符

char 数据类型设计为保存单个字符,可以是单个字母、数字、符号或空格。

char 数据类型是整数类型,这意味着基础值存储为整数。

初始化字符

可以使用字符文本初始化 char 变量:

char ch2{ 'a' }; // initialize with code point for 'a' (stored as integer 97) (preferred)

也可以使用整数初始化字符,但如果可能,应避免这样做

char ch1{ 97 }; // initialize with integer 97 ('a') (not preferred)

打印字符

#include <iostream>

int main()
{
    char ch1{ 'a' }; // (preferred)
    std::cout << ch1; // cout prints character 'a'

    char ch2{ 98 }; // code point for 'b' (not preferred)
    std::cout << ch2; // cout prints a character ('b')


    return 0;
}

在这里插入图片描述

字符大小、范围和默认符号

Char 由 C++ 定义为大小始终为 1 字节。

默认情况下,字符可以是有符号的,也可以是无符号的(尽管它通常是有符号的)。如果使用字符来保存 ASCII 字符,则无需指定符号(因为有符号和无符号字符都可以保存介于 0 和 127 之间的值)。

如果使用 char 来保存小整数(除非显式优化空间,否则不应这样做),则应始终指定它是有符号还是无符号。有符号的字符可以保存介于 -128 和 127 之间的数字。无符号字符可以保存 0 到 255 之间的数字。

将符号放在单引号和双引号中有什么区别

  • 单个字符总是放在单引号中:一个字符只能代表一个符号。
  • 双引号之间的文本:被视为多个字符的字符串。

类型转换

隐式类型转换

当编译器在没有我们明确询问的情况下代表我们进行类型转换时,我们称之为隐式类型转换。

#include <iostream>

void print(double x) // print takes a double parameter
{
	std::cout << x << '\n';
}

int main()
{
	print(5); // what happens when we pass an int value?

	return 0;
}

某些类型转换始终是安全的,而其他类型转换可能会导致在转换过程中更改值。不安全的隐式转换通常会生成编译器警告,或者(在大括号初始化的情况下)错误。

这是大括号初始化是首选初始化形式的主要原因之一。大括号初始化将确保我们不会尝试使用初始值设定项初始化变量,该变量在隐式类型转换时会丢失值:

int main()
{
    double d { 5 }; // okay: int to double is safe
    int x { 5.5 }; // error: double to int not safe

    return 0;
}

显式类型转换

通过 static_cast 运算符进行显式类型转换。

static_cast<new_type>(expression)

示例:

#include <iostream>

void print(int x)
{
	std::cout << x << '\n';
}

int main()
{
	print( static_cast<int>(5.5) ); // explicitly convert double value 5.5 to an int

	return 0;
}

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

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

相关文章

【MySQL】数据库中常用的函数

目录 聚合函数COUNT()函数的多种用法COUNT(*)COUNT(主键)COUNT(1)COUNT(常量)COUNT(非主键)COUNT(distinct(字段)) COUNT()函数小结 字符函数length(str)函数&#xff1a;获取参数值的字节个数concat(str1,str2,...)函数&#xff1a;字符串拼接upper(str)、lower(str)函数:大小…

部署Docker私有镜像仓库Harbor

Harbor介绍 Harbor 是为企业用户设计的开源镜像仓库项目&#xff0c;包括了权限管理(RBAC)、LDAP、审计、安全漏洞扫描、镜像验真、管理界面、自我注册、HA等企业必需的功能&#xff0c;同时针对中国用户的特点&#xff0c;设计镜像复制和中文支持等功能。 官网&#xff1a;h…

kotlin开发环境搭建,算法题+JVM+自定义View

什么是中年危机 根据权威数据显示&#xff0c;国内IT程序员鼎盛时期是在25-27岁左右&#xff0c;30岁对于程序员而言完全是一个38线&#xff0c;接着就是转业转岗的事情&#xff0c;这一点在业界也算是一个共识了。 大学毕业步入IT行业普遍年龄也是在22岁左右&#xff0c;然而…

线程安全的队列

学习一下别人写的&#xff0c;线程安全的队列代码。https://github.com/markparticle/WebServer/blob/master/code/log/blockqueue.hhttps://github.com/markparticle/WebServer/blob/master/code/log/blockqueue.h /** Author : mark* Date : 2020-06-16* copy…

20240301作业

1.使用fwrite、fread将一张随意的bmp图片&#xff0c;修改成德国的国旗 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> int main(int argc, const char *argv[]) {FILE* fp fopen("./gaoda.bmp","…

Attention 中的 Q, K, V

Attention 中的 Q, K, V flyfish Attention Is All You Need. Q query 查询 K key 键 V value 值 简单理解 一篇文章&#xff0c;文章的标题就是key&#xff0c;文章的内容就是V 使用搜索引擎时&#xff0c;输入到 搜索栏中的文本 就是 query 输入内容 query 与 文章标…

你不可不知的数据安全词汇都在这!

关注公众号&#xff0c;回复关键词 “数据安全”&#xff0c;即可获取报告完整版 随着数字化时代的快速发展&#xff0c;数据安全已成为全球企业和组织面临的一项重大挑战。在这一背景下&#xff0c;我们深感需要有一个统一的、全面的数据安全术语基础&#xff0c;以便行业从业…

P2040 打开所有的灯

题目传送门&#xff1a;P2040 打开所有的灯 用深度优先搜索实现的一个填色题。 题目步骤&#xff1a; 1..dfs 首先dfs要判断是否符合题意&#xff0c;如果符合题意就更新最短路&#xff1b; 如果不符合题意就枚举 如果是关的就把周围四个包括 给标记上和原来相反的&#xf…

Redis--持久化机制详解

什么是redis持久化&#xff1f; Redis持久化是将内存的数据持久化到磁盘上&#xff0c;防止Redis宕机或者断点的时候内存中的数据丢失&#xff0c;把内存中的数据写入到磁盘的过程叫持久化。 Redis持久化的方式&#xff1f; RDB&#xff08;Redis DataBase&#xff09;&…

【YOLO v5 v7 v8 小目标改进】中心化特征金字塔(CFP) = 特征金字塔 + 显式视觉中心(EVC)+ 全局集中调节(GCR)

中心化特征金字塔&#xff08;CFP&#xff09; 特征金字塔 显式视觉中心&#xff08;EVC&#xff09; 全局集中调节&#xff08;GCR&#xff09; 提出背景中心化特征金字塔&#xff08;CFP&#xff09;CFP 架构图问题&#xff1a;不同尺度的对象检测问题&#xff1a;有限感受…

LeetCode //C - 118. Pascal‘s Triangle

118. Pascal’s Triangle Given an integer numRows, return the first numRows of Pascal’s triangle. In Pascal’s triangle, each number is the sum of the two numbers directly above it as shown: Example 1: Input: numRows 5 Output: [[1],[1,1],[1,2,1],[1,…

Spring Cloud 构建面向企业的大型分布式微服务快速开发框架+技术栈介绍

分布式架构图 Cloud架构清单 Commonservice&#xff08;通用服务&#xff09; 1&#xff09;清单列表 2&#xff09;代码结构 Component&#xff08;通用组件&#xff09; 1&#xff09;清单列表 2&#xff09;代码结构 快速开发管理平台——云架构【系统管理平台】 一…

python requests接口自动化测试 (数据库断言)

前言 熟练掌握接口自动化测试体系背后的这些技能和处理问题的思路&#xff0c;实现时间、人力、收益的平衡&#xff0c;对于一个经验尚浅的初、中级测试开发人员来说绝对是一个艰巨的挑战。 五步教会你写接口自动化用例 需要安装三方包:requests pytest pytest-htmlpip insta…

视觉三维重建colmap框架的现状与未来

近两年AI技术的火热尤其是nerf和gaussian splatting的出现&#xff0c;又将colmap推了一把&#xff0c;传统mvs的地位仿佛受到了挑战&#xff0c;虽然说nerf/gs的效果是无法胜任传统mvs的精度&#xff0c;但是作为"看看"的条件&#xff0c;是远远足够了。且传统重复纹…

chartjs 饼状图

之前要把canvas先清除掉&#xff0c;不然刷新数据&#xff0c;还会有前面的图表 function clearCanvas(){$(#donutChart).remove();$(#chartdiv).append(<canvas id"donutChart" style"min-height: 500px; height: 500px; max-height: 500px; max-width: 70%…

一文搞懂 Transformer 工作原理 !!

文章目录 前言 一、单头Attention工作原理 二、多头Attention工作原理 三、全连接网络工作原理 前言 本文将从单头Attention工作原理、多头Attention工作原理、全连接网络工作原理三个方面&#xff0c;实现一文搞懂Transformer的工作原理。 Transformer工作原理 一、单头Atte…

【学习记录】Resnet

Resnet的残差块 BasicBlock模块&#xff1a; Resnet的作用 解决梯度消失。网络越深&#xff0c;会导致梯度消失。Resnet可以解决梯度消失的问题。 Resnet的原理 参考视频&#xff1a;https://www.bilibili.com/video/BV1cM4y117ob/?spm_id_from333.337.search-card.all.cl…

达梦数据库查询语句内存溢出问题解决

背景&#xff1a;达梦数据库使用过程中&#xff0c;某天突然服务宕机&#xff0c;导致各类后端服务无法注册到nacos上&#xff0c;重启之后nacos正常启动&#xff0c;可执行一条两千多条数据量的连表查询时间很长&#xff0c;甚至会报错&#xff0c;经查看日志发现在查询过程中…

恒创科技:服务器CPU核心和线程如何理解?

​  关于 CPU 核心和线程&#xff0c;是服务器处理能力的核心和灵魂&#xff0c;它们决定了服务器执行任务和同时处理多个操作的效率。 那么&#xff0c;服务器中的 CPU 核心和线程到底是什么?如何理解呢? 什么是CPU核心? CPU核心作为CPU(中央处理单元)的主要处理单元。该…

Windows下卸载JDK

操作步骤&#xff1a; 直接到windows程序卸载面板进行卸载 然后删除已配置的环境变量