C++初学者指南第一步---4.基本类型

C++初学者指南第一步—4.基本类型

文章目录

  • C++初学者指南第一步---4.基本类型
    • 1.变量声明
    • 2.快速概览
      • Booleans 布尔型
      • Characters 字符型
      • Signed Integers 有符号整数
      • Unsigned Integers 无符号整数
      • Floating Point Types 浮点数类型
    • 3.Common Number Representations 常用的数字表示常用数字的表示方法
    • 4.Arithmetic Operations 算术运算
      • Increment/Decrement 递增/递减
    • 5.Comparisons 比较运算
      • 2-way Comparisons 二元比较
      • 3-Way Comparisons With <=> 三元比较用<=> C++20
    • 6.布尔型逻辑运算
      • 操作符
      • 转换为布尔型
      • 短路求值
    • 7.基础类型的内存大小
    • 8.std::numeric_limits<type> (数值范围模板类)
    • 9.Type Narrowing类型缩小(类型窄化)
    • 10.花括号初始化(统一初始化)C++11
    • 11.位运算
      • Bitwise Logic 按位逻辑运算
      • Bitwise Shifts 按位移位
    • 12.算术转换和提升

基本类型是所有复杂类型(如列表、哈希映射、树、图等)的基本构建块。

1.变量声明

变量声明的基本语法

type variable = value;
type variable {value};C++11
// 声明 & 初始化 'i':
int i = 1;
// 打印‘i’的值:
cout << i << '\n';  
int j {5};
cout << j << '\n';

在这里插入图片描述
注意:基本类型的变量默认不会被初始化!

int k;  // k不会被初始化!
cout << k << '\n';  // k可能是任何值

因为在c++中,你只需要为你使用的内存付出代价(大内存块的初始化可能相当昂贵)。
注意:但是: 在声明变量时,你几乎总是需要对其进行初始化,以防止出现bug!

2.快速概览

Booleans 布尔型

bool b1 = true;
bool b2 = false;

Characters 字符型

  • 最小整数;通常为1字节
  • 在x86/x86_64平台上,signed(有符合) 类型值的范围为[-128,127]。

Signed Integers 有符号整数

n bits ⇒ values ∈ [ − 2 n − 1 -2^{n-1} 2n1, 2 n − 1 2^{n-1} 2n1-1]
n位数 ⇒ 值属于 [ − 2 n − 1 -2^{n-1} 2n1 2 n − 1 2^{n-1} 2n1-1] 的范围

short s = 7;        
int   i = 12347;
long  l1 = -7856974990L;
long long  l2 = 89565656974990LL;
// ' C++14增加的数字分隔符,
long l3 = 512'232'697'499;

Unsigned Integers 无符号整数

n bits ⇒ values ∈ [0, 2 n − 1 2^{n-1} 2n1]
n位数 ⇒ 值属于 [0, 2 n − 1 2^{n-1} 2n1] 的范围

unsigned u1 = 12347U; 
unsigned long u2 = 123478912345UL;  
unsigned long long u3 = 123478912345ULL;  
// 非10进制
unsigned x = 0x4A;        // 16进制
unsigned b = 0b10110101;  // 二进制 C++14

Floating Point Types 浮点数类型

  • float 通常为IEEE 754格式32位。
  • double 通常为IEEE 754格式64位。
  • long double 在x86/x86-64上通常为80位。
float       f  = 1.88f;
double      d1 = 3.5e38;
long double d2 = 3.5e38L; C++11
// ' digit separator C++14
double d3 = 512'232'697'499.052;

3.Common Number Representations 常用的数字表示常用数字的表示方法

在这里插入图片描述
浮点数工具:值映射的交互式可视化工具

4.Arithmetic Operations 算术运算

  • 表达式 a ⊕ b 返回操作⊕应用于 a 和 b值的结果
  • 表达式 a ⊕= b 存储 a中操作⊕的结果
代码注释
int a = 4;
int b = 3;
变量a设置为值4
变量b设置为值3
a = a + b;
a += b;
a: 7 加法运算
a: 10
a = a - b;
a -= b;
a: 7 减法运算
a: 4
a = a * b;
a *= b;
a: 12 乘法运算
a: 36
a = a / b;
a /= b;
a: 12 除法运算
a: 4
a = a % b;a: 1 除法余数运算(取模)

Increment/Decrement 递增/递减

  • 将值更改为递增1/递减 1
  • 前缀表达式 ++x / --x 返回新的(递增/递减)值
  • 后缀表达式 x++ / x-- 增加/减少值,但返回旧值
代码注释
int a = 4;
int b = 3;
a: 4
b: 3
b = a++;
b = ++a;
a: 5 b: 4
a: 6 b: 6

5.Comparisons 比较运算

2-way Comparisons 二元比较

比较结果为 true 或 false

代码注释
int x = 10;
int y = 5;
bool b1 = (x == 5);
bool b2 = (x != 6);
false 相等比较
true 不相等比较
bool b3 = x > y;
bool b4 = x < y;
bool b5 = y >= 5;
bool b6 = x <= 30;
true 大于比较
false 小于比较
true 大于等于比较
true 小于等于比较

3-Way Comparisons With <=> 三元比较用<=> C++20

确定 2 个对象的相对顺序:
(a <=> b) < 0 如果 a < b
(a <=> b) > 0 如果 a > b
(a <=> b) == 0 如果 a 和 b 相等

  • 三元比较返回一个可与字面量 0 比较的比较类别值
  • 返回的值来自三种可能的类别之一:std::strong_ordering、std::weak_ordering 或 std::partial_ordering

4 <=> 6 → std::strong_ordering::less
5 <=> 5 → std::strong_ordering::equal
8 <=> 1 → std::strong_ordering::greater

6.布尔型逻辑运算

操作符

bool a = true;
bool b = false;
bool c = a && b;   // false    逻辑与 AND
bool d = a || b;   // true     逻辑或 OR
bool e = !a;       // false    逻辑非 NOT
// 备选的拼写:
bool x = a and b;  // false
bool y = a or b;   // true
bool z = not a;    // false

转换为布尔型

  • 0 始终为 false;
  • 其他一切都是true;
bool f = 12;   // true   (int → bool)
bool g = 0;    // false  (int → bool)
bool h = 1.2;  // true   (double → bool)

短路求值

如果出现以下情况,则不计算布尔比较的第二个操作数 在计算第一个操作数后,结果已经知道了。

int i = 2;  
int k = 8;
bool b1 = (i > 0) || (k < 3);

i > 0 已经是true ,k < 3不计算,因为逻辑或的结果已经是true。

7.基础类型的内存大小

所有类型大小都是 sizeof(char) 的倍数

cout << sizeof(char);   // 1
cout << sizeof(bool);   // 1
cout << sizeof(short);  // 2
cout << sizeof(int);    // 4
cout << sizeof(long);   // 8
// number of bits in a char
cout << CHAR_BIT;   // 8
char   c = 'A';
bool   b = true;
int    i = 1234;
long   l = 12;
short  s = 8;

在这里插入图片描述
大小取决于平台
C++仅提供基本保证

  • sizeof(short) ≥ sizeof(char)
  • sizeof(short) ≥ sizeof(char)
  • sizeof(int) ≥ sizeof(short)
  • sizeof(int) ≥ sizeof(short)
  • sizeof(long) ≥ sizeof(int)
  • sizeof(long) ≥ sizeof(int)

例如,在某些 32 位平台上: int = long

整数大小保证  C++11

#include <cstdint>
  • 精确尺寸(在某些平台上不可用)
    int8_t,   int16_t,   int32_t,   int64_t,   uint8_t, …
  • 保证最小尺寸
    int_least8_t,   uint_least8_t, …
  • 速度最快且保证最小尺寸
    int_fast8_t,   uint_fast8_t, …

固定宽度浮点类型保证  C++23

#include <stdfloat>

// storage bits: sign + exponent + mantissa(存储位: 符号 + 指数 + 尾数)
std::float16_t  a = 12.3f16;   // 1 +  5  +  10 =  16 bits =  2 B
std::float32_t  b = 12.3f32;   // 1 +  8  +  23 =  32 bits =  4 B
std::float64_t  c = 12.3f64;   // 1 + 11  +  52 =  64 bits =  8 B
std::float128_t d = 12.3f128;  // 1 + 15  + 112 = 128 bits = 16 B
std::bfloat16_t e = 12.3b16;   // 1 +  8  +   7 =  16 bits =  2 B

8.std::numeric_limits (数值范围模板类)

#include <limits>
// smallest negative value:(double类型的最小负值)
cout << std::numeric_limits<double>::lowest();
// float/double: smallest value > 0 (float/double类型的最小正值)
// integers: smallest value
cout << std::numeric_limits<double>::min();
// largest positive value:(可以表示的最大正值)
cout << std::numeric_limits<double>::max();
// smallest difference btw. 1 and next value:(1和下一个值之间最小差值,用于浮点数比较)
cout << std::numeric_limits<double>::epsilon();

在这里插入图片描述
cppreference:数值限制

9.Type Narrowing类型缩小(类型窄化)

  • 从可以表示更多值的类型转换为可以表示更少值的类型
  • 可能会导致信息丢失
  • 一般来说,没有编译器警告——默默地发生
  • 隐藏的潜在运行时错误来源
double   d = 1.23456;
float    f = 2.53f;
unsigned u = 120u;
double e = f;  // OK  float → double
int i = 2.5;   // 缩小 double → int
int j = u;     // 缩小 unsigned int → int
int k = f;     // 缩小 float → int

10.花括号初始化(统一初始化)C++11

type variable { value };
  • 适用于所有基本类型
  • 缩小转换 ⇒ 编译器警告
double   d {1.23456};  // OK
float    f {2.53f};    // OK
unsigned u {120u};     // OK
double e {f};  // OK float → double
int i {2.5};   //  COMPILER WARNING: double       → int
int j {u};     //  COMPILER WARNING: unsigned int → int
int k {f};     //  COMPILER WARNING: float        → int

注意:确保防止静默类型转换,特别是将无符号整数转换缩小为有符号整数转换——它们会导致难以发现的运行时错误!

11.位运算

Bitwise Logic 按位逻辑运算

表达式说明
a & bAND按位与
a | bOR按位或
a ^ bXOR按位异或
~aNOT按位反(反码)
#include <cstdint>
std::uint8_t a = 6;  
std::uint8_t b = 0b00001011;
std::uint8_t c1 = (a & b);  // 2
std::uint8_t c2 = (a | b);  // 15
std::uint8_t c3 = (a ^ b);  // 13
std::uint8_t c4 = ~a;       // 249
std::uint8_t c5 = ~b;       // 244
// test if int is even/odd:
bool a_odd  = a & 1;
bool a_even = !(a & 1);
memory bits:
0000 0110
0000 1011
0000 0010
0000 1111
0000 1101
1111 1001
1111 0100
result:
0false
1true

Bitwise Shifts 按位移位

表达式说明
x << n返回 x 的值,其位向左移动 n 位
x >> n返回 x 的值,其位向右移动 n 位
x <<= n通过向左移动 n 位来修改 x
x >>= n通过向右移动 n 位来修改 x
#include <cstdint>
std::uint8_t a = 1;
a <<= 6;  // 64
a >>= 4;  // 4
std::uint8_t b1 = (1 << 1);  // 2
std::uint8_t b2 = (1 << 2);  // 4
std::uint8_t b3 = (1 << 4);  // 16
memory bits:
0000 0001
0100 0000
0000 0100
0000 0010
0000 0100
0001 0000

注意:把一个数据类型为N位的对象移动N位或更多位是未定义行为!

std::uint32_t i = 1;  // 32 bit type
i <<= 32;   未定义行为!
std::uint64_t j = 1;  // 64 bit type
j <<= 70;   未定义行为!

12.算术转换和提升

很遗憾,这里有一大堆规则(可以追溯到C语言)的目的是确定二元运算的两个操作数和结果的共同类型
Operand A ⊕ Operand B → Result

简单总结

涉及至少一种浮点类型的运算

  • long double ⊕ any other type → long double
  • double ⊕ float → double
  • double ⊕ any integer → double
  • float ⊕ any integer → float

两种整数类型的运算

  1. 先对两个操作数执行整数提升:基本上任何小于int的值都会被提升为int或unsigned int(取决于哪一种类型可以表示未提升类型的所有值)
  2. 如果两个操作数类型不同,则应用整数转换:
  • 两个有符号:较小类型转换为较大类型
  • 两个无符号:较小类型转换为较大类型
  • 有符号 ⊕ 无符号:
    1. 如果两者位宽相同,有符号转换为无符号
    2. 否则,如果无符号类型可以表示有符号类型的所有值,无符号转换为有符号
    3. 否则,两者都转换为无符号

附上原文链接
翻译和整理文章不易,如果文章对您有用请随手点个赞,谢谢!

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

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

相关文章

用Copilot画漫画,Luma AI生成视频:解锁创意新玩法

近年来&#xff0c;随着人工智能技术的不断发展&#xff0c;各种创意工具也层出不穷。今天&#xff0c;我们就来介绍一种全新的创作方式&#xff1a;使用Copilot画漫画&#xff0c;再将漫画放入Luma AI生成视频。 Copilot&#xff1a;你的AI绘画助手 Copilot是一款基于人工智…

【Kubernetes项目部署】k8s集群+高可用、负载均衡+防火墙

项目架构图 &#xff08;1&#xff09;部署 kubernetes 集群 详见&#xff1a;http://t.csdnimg.cn/RLveS &#xff08;2&#xff09; 在 Kubernetes 环境中&#xff0c;通过yaml文件的方式&#xff0c;创建2个Nginx Pod分别放置在两个不同的节点上&#xff1b; Pod使用hostP…

TCP及UDP协议

tcp是点到点的&#xff0c;只有一条路径&#xff0c;到达顺序和发送顺序是相同的 回复的确认号是序发送端的序列号加上data的长度 1910 发送端的序列号也是那么算的 ack和下一个seq一样 那就没问题 三次握手四次挥手&#xff1a; 为啥是三次呢&#xff1f; 假如一次&#xf…

SpringBoot使用jasypt实现数据库信息的脱敏,以此来保护数据库的用户名username和密码password(容易上手,详细)

1.为什么要有这个需求&#xff1f; 一般当我们自己练习的时候&#xff0c;username和password直接是爆露出来的 假如别人路过你旁边时看到了你的数据库账号密码&#xff0c;他跑到他的电脑打开navicat直接就是一顿连接&#xff0c;直接疯狂删除你的数据库&#xff0c;那可就废…

学习笔记——网络管理与运维——SNMP(SNMP架构)

三、SNMP架构 1、SNMP结构概述 SNMP被设计为工作在TCP/IP协议族上&#xff0c;基于TCP/IP协议工作&#xff0c;对网络中支持SNMP协议的设备进行管理。所有支持SNMP协议的设备都提供SNMP这个统一界面&#xff0c;使得管理员可以使用统一的操作进行管理&#xff0c;而不必理会设…

基于Spring+Vue的前后端分离的计算器

麻雀虽小&#xff0c;五脏俱全 该项目已部署上线&#xff1a;http://calculator.wushf.top/ 并通过Gitee Go流水线实现持续部署。 需求分析 表达式求值 支持加减乘除四则运算、支持高精度 获取日志 Api文档定义 前后端分离&#xff0c;人不分离 通过Apifox定义接口细节&#…

「TCP 重要机制」三次握手四次挥手

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;计网 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 三次握手&四次挥手 &#x1f349;连接管理&#x1f34c;三次握手&#x1f34c;意义&#x1f34c;四次挥手&#x1f34c;TCP 状态转换…

深入分析 Android BroadcastReceiver (三)

文章目录 深入分析 Android BroadcastReceiver (三)1. 广播消息的优缺点及使用场景1.1 优点1.2 缺点 2. 广播的使用场景及代码示例2.1. 系统广播示例&#xff1a;监听网络状态变化 2.2. 自定义广播示例&#xff1a;发送自定义广播 2.3. 有序广播示例&#xff1a;有序广播 2.4. …

[算法刷题—二分法]寻找插入位置

题目展示: 本道题本身并不是很难,主要是学习和分析二分查找插入位置的方法。 首先大体上分为两种情况: 一.target在待查找的数组之中,返回对应值的下标索引。 二.target不在待查找的数组之中&#xff0c;需要返回target插入位置的索引(原数组有序) 第一种情况不难&#xff…

跟着AI学AI_08 NumPy 介绍

NumPy&#xff08;Numerical Python&#xff09;是一个用于科学计算的基础库&#xff0c;它为 Python 提供了支持大规模多维数组和矩阵 NumPy 介绍 NumPy&#xff08;Numerical Python&#xff09;是一个用于科学计算的基础库&#xff0c;它为 Python 提供了支持大规模多维数…

最新版点微同城源码34.7+全套插件+小程序前后端(含安装教程)

模板挺好看的 带全套插件 自己耐心点配置一下插件 可以H5可以小程序 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89394996 更多资源下载&#xff1a;关注我。

【单元测试】Spring Boot 的测试库

Spring Boot 的测试库 1.了解回归测试框架 JUnit2.了解 assertThat3.了解 Mockito4.了解 JSONPath5.测试的回滚 单元测试&#xff08;unit test&#xff09;是为了检验程序的正确性。一个单元可能是单个 程序、类、对象、方法 等&#xff0c;它是应用程序的最小可测试部件。 单…

ATMEGA16读写24C256

代码&#xff1a; #include <mega16.h> #include <stdio.h> #include <i2c.h> #include <delay.h> // Declare your global variables here #define EEPROM_BUS_ADDRESS 0xa0 #asm.equ __i2c_port0x15.equ __sda_bit1 .equ __scl_bit0 #endasm uns…

课设--学生成绩管理系统(二)

欢迎来到 Papicatch的博客 目录 &#x1f40b;引言 &#x1f988;编写目的 &#x1f988;项目说明 &#x1f40b;产品介绍 &#x1f988;产品概要说明 &#x1f988;产品用户定位 &#x1f988;产品中的角色 &#x1f40b; 产品总体业务流程图 &#x1f40b; 产品功…

Pixel Transformer:用像素代替补丁可以提升图像分类精度

在快速发展的人工智能领域&#xff0c;ViTs已成为各种计算机视觉任务的基础模型。ViTs通过将图像划分为小块并将这些小块作为标记来处理图像。6月刚发布一篇论文&#xff0c;引入了一种新颖的方法&#xff0c;即像素级Transformers&#xff0c;它通过将单个像素视为令牌来挑战这…

【深度学习】基于EANet模型的图像识别和分类技术

1.引言 1.1.EANet模型简介 EANet&#xff08;External Attention Transformer&#xff09;是一种深度学习模型&#xff0c;它结合了Transformer架构和外部注意力机制&#xff0c;特别适用于图像分类等计算机视觉任务。以下是关于EANet的详细解释&#xff1a; 1.1.1 定义与背…

2024年了,苹果可以通话录音了

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 6月11日凌晨&#xff0c;苹果在WWDC24大会上&#xff0c;密集输出了酝酿多时的AI应用更新。苹果对通话、对话、图…

从传统到智能:数字孪生在火电厂中的应用

通过图扑 HT 可视化技术数字孪生正在运行的火力发电厂&#xff0c;搭建数字化运营平台&#xff0c;对发电厂进行工厂式精细化的数字化管理&#xff0c;提升企业对整个发电厂业务进行数字化管理能力。

virtualbox扩展磁盘

使用virtualbox搭建虚拟机&#xff0c;如果磁盘不够用了&#xff0c;可以通过以下方式扩展。 扩容磁盘 分区扩展 查看磁盘情况 fdisk -l Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors Units sectors of 1 * 512 512 bytes Sector size (logical/phys…

探索开源世界:2024年值得关注的热门开源项目推荐

文章目录 每日一句正能量前言GitCode成立背景如何使用GitCode如何把你现有的项目迁移至 GitCode&#xff1f;热门开源项目推荐actions-poetry - 管理 Python 依赖项的 GitLab CI/CD 工具项目概述技术分析应用场景特点项目地址 Spider - 网络爬虫框架项目简介技术分析应用场景项…