casting 就是资料型态之间的转换。
例如把 A type 转换成 B type。 但是这中间会发生一些问题。
每个变数就像是一个水桶一样,拥有不同的容量可以存取资讯,而这些资讯就像是水一样,可以被装进水桶里面,但是在不同的水桶里面会以不一样的方式呈现。
就拿 int 做举例,他的容量是 4 个 byte,short 只有 2 个 byte,long 也有 4 个 byte。
每个变数,就像是具有不一样的形状水桶,
例如:
int 和 float 可以存入的资讯大小是一模一样的,但是他们装入的资讯却是不一样的。
int 只有装入正负号、整数的部分;
但是 float 却可以装入正负号、整数、还有小数的部分。
所以我会把每个变数想像成不同大小的水桶,例如 int 是圆柱形、float 是长方形(随便假设的xd)。
这个部分,可以很简单的来说就是
把容量比较小的变数,转换成容量比较大的变数。
原本有两个水瓶,一个现在是装满水的、另外一个是空的,装满水的那个水瓶的容量是 500 mL;空的那个水瓶容量是 1000 mL。所以直接把装满水的水瓶中的水,直接倒入空水瓶,一滴都不会漏出来。
所以在 implicit casting 的情况,资料的值以及精确度都不会流失或改变。
与 Implicit casting 的情形相反,explicit casting 就是把容量比较大的变数,转换成容量比较小的变数。
而这种转换的问题在於,大的变数转换成小的变数时,会发生 overflow 的情形。
简单来说,就是跟上面的情形一样,有一个装满水的水瓶,但是这次容量比较大,是1000mL;而另外一个空的水瓶只有 500 mL。如果把水全部倒进空的水瓶的话,水就会满出来,导致水的流失。
但是在 explicit casting 的情况下却会因为 overflow等原因产生资讯值或是精确度的改变。
在进行 explicit casting 的时候,需要告知 compiler 或是未来可能会看到这段 code 的人,你要进行 explicit casting。
那, explicit casting 要怎麽写咧?
(X) : int number = 5.6
才不是这样写。
(O) : int number = static_cast<int>(5.6);
这样才对嘛!
所以可以看到这种转换的公式:
static_cast<*type*>(*expression*);
注: 当 float 或是 double 转换成 int 的时候,他的小数部分会被截断,无条件舍去!
那为什麽我们需要自己做 casting 呢?何不交给电脑自己处理?
这是因为在explicit casting 中,我们可以明确的指出我们需要做出何种 casting (ex: float → int),且因为当你是自己写的时候,compiler 才不会因为自己判断而出现错误,你又抓不出问题在哪里。
下面就来个 char 跟 int 产生 overflow 的例子:
#include<iostream>
using namespace std;
int main(){
char c = 254;
int a = 10;
cout << c + a;
}
这段程序的结果会跑出 8
你可能会觉得很奇怪,但是要注意
char 的最大值只到 127欸,他早就已经 overflow 了,所以就会发生出现 8 的情形啦。
Casting 就像是我现在的人生一样
要从不同领域转换到另一个领域
所以我应该是需要 explicit casting 的 ☹️
<<: Day 07:大人更要懂选择-BootstrapVue 部分引入
Scaffold-DbCoNtext 为资料库的 DbContext 和实体类型产生程序码。 为了让...
GoogLeNet Google提出的GoogLeNet,层数比较多,运算的效率相当好,超参数数量比...
Colab连结 图片标准化 Image Normalization 不做可以吗?小实验实测差别 一般...
Kubernetes是一个知名的分散式管理、编排Container工具,帮助你将不同的dockeri...
Banner 现在因为网路发达加上疫情,网购变得很稀松平常,而在这些购物网站中一定会出现广告的部分,...