首页 > 编程语言 >C++类型转换

C++类型转换

时间:2024-05-12 15:57:08浏览次数:32  
标签:类型转换 const int C++ char cast 类型 指针

一、整形提升

整型提升是一种隐式类型转换,当涉及到小于int类型的整数(如char、short、bool等)时。整型提升的目的是确保所有的操作数在算术运算或比较操作中具有相同的类型,通常是int类型,如果int不能表示该值,则可能会提升到unsigned int或更大的整数类型。

二、无符号数和带符号数进行运算的原则

如果一个是无符号数,另一个是带符号类型,那么:

  • 无符号类型 >= 带符号类型,带符号类型转化为无符号类型。
unsigned int a = 10u;
int b = 5;
cout << a + b << endl;
//b转化为unsigned int
  • 无符号类型 < 带符号类型,此时结果依赖于机器。如果无符号数类型的所有值都能存在该带符号类型中,则无符号类型的运算对象转换成带符号类型。
    不能,那么带符号类型的运算对象转换成无符号类型。

三、算数转换

bool b;
char c;
short s;
unsigned short us;
int i;
unsigned int ui;
long l;
unsigned long ul;
float f;
double d;

cout << 3.14159L + 'a' << endl;
//此处'a' 先提升至int,然后int转化为long double类型

cout << c + f << endl;
//char先提升为int,然后该int转化为float

cout << s + c << endl;
//short和char都提升为int

cout << us + i << endl;
//根据unsigned short和int所占空间大小进行整型提升
cout << ui + l << endl;
//同上

四、显示转换

C++中类型强制转换的形式如下:

cast_name<type>(expr);

1、static_cast

① 不含底层const的均可使用

const char* c = "hello";
string s = static_cast<char *>(c);  //error,不能为底层const
cout << s << endl;
char* const c = "hello"
string s = static_cast<char *>(c);  //right,const为顶层const
cout << s << endl;

②不能用于高风险转换。
指针和非指针类型
不同类型的指针之间
不同类型的引用之间

③将一个大的算术类型赋值给小的算数类型

double d = 3.14159;
int i = static_cast<double>(d);

cout << i << endl;

④编译器无法自动执行类型转换时

2、const_cast

const_cast只针对指针、引用,当然,this指针也是其中之一。
const_cast可以用来移除常量性。移除后再对常量进行修改,编译器不会进行阻止。

用于指针

const char *cp;
char *p = const_cast<char *>(cp);

用于引用

int a = 0;
const int &b = a;

int &c = const_cast<int &>(b);
c = 10;

const_cast只能改变常量属性,并不能更改基础类型

只能改变常量属性

const char *c = "hello";
string *s = const_cast<string *> c; 
//error:不能改变基础类型

3、reinterpret_cast

reinterpret_cast提供了最低级别的转换,将一个指针或整数类型转换为另一个指针或整数类型,而不进行任何类型检查或转换。它基本上是对位模式的重新解释,这意味着它不会改变值,只是改变了编译器如何解释这个值

reinterpret_cast 是一个非常强大但也非常危险的工具,因为它允许程序员绕过 C++ 的类型系统。

以下是它的一些常见用法和注意事项:

  • 指针到指针的转换:
    reinterpret_cast 允许你将一个类型的指针转换为另一个类型的指针,而不考虑这两个类型是否兼容。
int *ptr_int = new int(10);  
char *ptr_char = reinterpret_cast<char*>(ptr_int);

但是,这样做通常是不安全的,除非你确切知道你在做什么(例如,处理内存映射文件或低级硬件操作)。

  • 整数到指针的转换:
    在某些情况下,你可能需要将整数(通常是地址)转换为指针。虽然 static_cast 在这种情况下不起作用,但 reinterpret_cast 可以。
int addr = ...; // 假设这是一个有效的内存地址  
void *ptr = reinterpret_cast<void*>(addr);

函数指针的转换:reinterpret_cast 也允许你转换函数指针的类型。但是,除非你知道目标类型的函数签名与源类型的函数签名完全匹配,否则这样做是非常危险的。

标签:类型转换,const,int,C++,char,cast,类型,指针
From: https://www.cnblogs.com/baobaobashi/p/18187878

相关文章

  • Effective C++:2.构造、析构、赋值函数
    几乎每个class都会有一个或者多个构造函数,一个析构函数,一个copyassignment函数,因此有必要加深理解1.条款05:了解C++默默编写并调用哪些函数如果你没有生成一下函数,那么C++会在需要的时候(被调用)帮你自动生成这些函数:default构造函数copy构造函数default析构函数copyassign......
  • 编程竞赛中 C/C++ I/O 的使用
    C的字符串读取scanf以空行为分割进行读取数据。get和fgets以\n为分割读取数据。读取输入直到遇到\n或\0才终止。C++读取字符串cin以空格为分割读取数据。getline默认以换行符为分割读取数据。在使用getline时,要注意处理多个\n连到一块的情况。当读取77\n\n77时,......
  • EasyLogger - 一款超轻量级、高性能的 C/C++ 日志库
    1、EasyLogger-一款超轻量级、高性能的C/C++日志库EasyLogger是一款超轻量级(ROM<1.6K,RAM<0.3K)、高性能的C/C++日志库,非常适合对资源敏感的软件项目,例如:IoT产品、可穿戴设备、智能家居等等。相比log4c、zlog这些知名的C/C++日志库,EasyLogger的功能更加简单,提供......
  • C++_函数式编程-以及常用序列化
    函数式编程函数式编程是一种编程范式,它强调程序的构建是通过应用(applying)和组合函数(composingfunctions)来实现的函数式编程属于“结构化编程”的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用 LambdaCalculus函数式编程语言早期的函数式......
  • C和C++中size sizeof strlen length的对比
    一、sizeof()sizeof是一个操作符,它在编译期间确定的,返回的是静态大小。它可以应用于基本类型、类类型、数组和指针等。例如:sizeof(int)或sizeof(array)。对于数组,sizeof返回整个数组的大小(包括所有元素)。对于指针,sizeof返回指针本身的大小(通常取决于平台和编译器,例如在3......
  • gcov - 标准c/c++代码覆盖率测试工具+lcov - GCC测试覆盖率的前端图形展示工具+gprof
    1、advent-calendar-of-circuits-2020-一个月每天用KiCad设计一个PCB项目GregoryDavill是来自澳大利亚的一个技术牛人,在开源硬件领域非常有名且活跃。他在2020年12月坚持每一天设计一个电路板,用KiCad完成电路设计到PCB的布局布线完成,这便是advent-calendar-of-circuits-......
  • C++中的string
    一、定义和初始化string1、默认初始化:std::stringstr;//str是一个空字符串2、使用字面值初始化:std::stringstr1="Hello,World!";//str1包含字符串"Hello,World!"3、使用字符数组初始化:chararr[]="Hello,World!";std::stringstr3(arr);//str3包含字......
  • C++ 类的继承(Inheritance)
    一、继承(Inheritance)C++有一个很好的性质称为inheritance(继承),就是声明一个class(derivedclass),把另一个或多个class(baseclass)的所有内容(包括datamembers和memberfunction)统统继承下来(有无存取权限是另一回事)。如果直接继承自一个baseclass,称为单一继承;如果直接继承自一......
  • C++基础知识
    单行注释//多行注释/**/常量#define常量名常量值const数据类型常量名=常量值关键字不要和变量或常量重名数据类型短整型(2字节)-整型(4字节)-长整型(4字节)-长长整型(8字节)short<int<=long<=longlong实型float(4)-double(8)科学计数法3e23*10^23e-23*......
  • C/C++ 泛型 -- 继承与多态
    【1】继承与多态-- 多态在模板中的应用#include<iostream>usingnamespacestd;namespace_nmsp1{//多态//人类classHuman{public:virtualvoideat(){cout<<"人类以吃米饭和面食为主!"<<endl;......