C++基本类型简介

前言

本篇文章开始介绍C++

本篇文章介绍C++基本类型相关的概念和注意事项

类型选择

对于基本类型int、short、long、long long。默认都是带符号的,如果使用不带符号的类型,需要在前面添加关键字unsigned

对于char类型,默认是带符号还是不带符号根据编译器而定。虽然书上是这么说的,但是我使用xcode、vs2022和linux上用gcc编译对比结果都是把char当作signed char处理的。

类型选择的一般规律:

  • 明确知晓数值不可能为负时,使用无符号类型
  • 使用int执行整数运算,如果超出int范围,使用long long,因为对于C/C++,官方只保证long的大小不小于int,有可能两者一样,使用long long比较保险。
  • 因为char的符号不确定性,在运算时不要使用char类型,可以使用signed char或者unsigned char
  • bool值有一个特点就是任何非0的数转成bool都为1.所以尽量不要使用bool值参与数值计算
  • 执行浮点数计算用double,因为double的运算速度不比float差,甚至会更好。并且double的精度比较高。

类型转换

下面是类型转换的一般规则:

  • 当我们把一个非布尔类型的算术值赋给布尔类型时,初始值为0。则结果为false, 否则结果为true。

  • 当我们把一个布尔值赋给非布尔类型时,初始值为false则结果为0,初始值为true则结果为1

  • 当把一个浮点数赋值给整数时,会向0的方向进行截断,只保留整数部分,例如3.14会变成3,-3.14会变成-3。

  • 当把一个整数类型赋值给浮点数时,小数部分变为0,如果该整数占用的空间超过浮点类型的容量,精度可能损失。

  • 当无符号数和有符号数之间进行数据转换的时候,内存数据不变,只改变数据的解释方式

比如下面的例子:(PRINTBIT为打印数据内存二进制的宏,具体的定义参考文章https://blog.csdn.net/b1049112625/article/details/135251974)

复制代码
int main(int argc, const char * argv[]) 
{
    unsigned char a =255;
    char b = a;
    PRINTBIT(a);
    PRINTBIT(b);
    printf("a=%hhu\n",a);
    printf("b=%hhd\n",b);
    return 0;
}

输出:

复制代码
11111111
11111111
a=255
b=-1

运算中的数据转换规则和建议

  1. 如果使用一个非bool类型的值作为条件判断时,该值会自动转换成bool值,转换规则参考上面的第一条,然后在进行条件判断,所以说,一般不要在算数表达式中使用bool值

  2. 当一个运算表达式的操作两端分别为有符号数和无符号数时,运算之前,有符号数先转成无符号数

  3. 当从无符号数中减去一个值时,不管这个值是不是无符号数,我们都必须确保结果不能是一个负值,看下面的例子:

    复制代码
    for(unsigned int u=10; u>=0; u--)
    {
    	std::cout < u < std:: endl;
    }

    因为u是无符号数,所以无论怎么调用u--,他一直是个非负数,所以循环不会结束

总结:不要混用有符号数和无符号数

使用标识符标识字面值的类型

一个字面值可以通过添加前缀或者后缀来表明类型,下面列出前缀的修饰符

  • u:表明当前字符是一个unicode16字符,数据类型为char16_t
  • U:表明当前字符是一个unicode32字符,数据类型为char32_t
  • L:表明当前字符是一个宽字符,数据类型为wchar_t
  • u8:表明当前字符是一个utf-8编码的字符,数据类型为char

下面是后缀的修饰符:

  • u/U:表明当前类型为无符号数据类型
  • f/F:表明当前类型为float类型
  • l/L:如果当前数据是一个浮点数,表明类型为long double,默认为double;如果当前数据是一个整型,表明类型为long,默认为int
  • ll/LL:如果当前数据是一个整型,表明类型为long long

列表初始化

在C++11标准中,可以使用列表初始化来为变量赋初值,可以按照下面这两种方式使用:

复制代码
int a = {0};
int b{1};

列表初始化有个特点,如果我们使用列表初始化且初始值存在丢失信息的风险,则编译器将报错,看下面的例子:

复制代码
    int c = 3.14;
    int d(3.14);
    int a = {3.14};
    int b{3.14};

c、d不会报错,a、b会报错。

变量初始化

  • 对于内置类型
    • 如果在函数内定义,值是未定义的
    • 如果在函数外定义,默认为0,char默认为空字符
  • 对于类类型,每个类各自决定其初始化对象的方式

变量能且只能被定义一次,但是可以被多次声明

相关推荐
papership42 分钟前
【入门级-C++程序设计:12、文件及基本读写-文件的基本概念&文本文件的基本操作】
开发语言·c++·青少年编程
SaleCoder2 小时前
用Python构建机器学习模型预测股票趋势:从数据到部署的实战指南
开发语言·python·机器学习·python股票预测·lstm股票模型·机器学习股票趋势
玩代码7 小时前
备忘录设计模式
java·开发语言·设计模式·备忘录设计模式
岁忧8 小时前
(nice!!!)(LeetCode 面试经典 150 题 ) 30. 串联所有单词的子串 (哈希表+字符串+滑动窗口)
java·c++·leetcode·面试·go·散列表
技术猿188702783518 小时前
实现“micro 关键字搜索全覆盖商品”并通过 API 接口提供实时数据(一个方法)
开发语言·网络·python·深度学习·测试工具
放飞自我的Coder8 小时前
【colab 使用uv创建一个新的python版本运行】
开发语言·python·uv
SunkingYang8 小时前
MFC/C++语言怎么比较CString类型最后一个字符
c++·mfc·cstring·子串·最后一个字符·比较
界面开发小八哥9 小时前
MFC扩展库BCGControlBar Pro v36.2新版亮点:可视化设计器升级
c++·mfc·bcg·界面控件·ui开发
R-G-B9 小时前
【15】MFC入门到精通——MFC弹窗提示 MFC关闭对话框 弹窗提示 MFC按键触发 弹窗提示
c++·mfc·mfc弹窗提示·mfc关闭弹窗提示·mfc按键触发 弹窗提示
艾莉丝努力练剑9 小时前
【数据结构与算法】数据结构初阶:详解顺序表和链表(四)——单链表(下)
c语言·开发语言·数据结构·学习·算法·链表