一、整形提升
整型提升是一种隐式类型转换,当涉及到小于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