Day 10 - 转换人生跑道

简介

casting 就是资料型态之间的转换。

例如把 A type 转换成 B type。 但是这中间会发生一些问题。


变数就像容器一样

每个变数就像是一个水桶一样,拥有不同的容量可以存取资讯,而这些资讯就像是水一样,可以被装进水桶里面,但是在不同的水桶里面会以不一样的方式呈现。


不同的大小

就拿 int 做举例,他的容量是 4 个 byte,short 只有 2 个 byte,long 也有 4 个 byte。


不同的形状

每个变数,就像是具有不一样的形状水桶,

例如:

int 和 float 可以存入的资讯大小是一模一样的,但是他们装入的资讯却是不一样的。

int 只有装入正负号、整数的部分;

但是 float 却可以装入正负号、整数、还有小数的部分。

所以我会把每个变数想像成不同大小的水桶,例如 int 是圆柱形、float 是长方形(随便假设的xd)。


资料型态的转换可以分为两种

Implicit casting:

这个部分,可以很简单的来说就是

把容量比较小的变数,转换成容量比较大的变数。

原本有两个水瓶,一个现在是装满水的、另外一个是空的,装满水的那个水瓶的容量是 500 mL;空的那个水瓶容量是 1000 mL。所以直接把装满水的水瓶中的水,直接倒入空水瓶,一滴都不会漏出来。

所以在 implicit casting 的情况,资料的值以及精确度都不会流失或改变。

Explicit 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 部分引入

>>:  登录档进阶清理与重组--什麽是有必要的整理

产生 资料库 DbContext 实体原型

Scaffold-DbCoNtext 为资料库的 DbContext 和实体类型产生程序码。 为了让...

模型架构--1

GoogLeNet Google提出的GoogLeNet,层数比较多,运算的效率相当好,超参数数量比...

【14】如果不做图片标准化(Normalization)会怎麽样

Colab连结 图片标准化 Image Normalization 不做可以吗?小实验实测差别 一般...

Day 28: Kubernetes 原理

Kubernetes是一个知名的分散式管理、编排Container工具,帮助你将不同的dockeri...

Android Studio初学笔记-Day23-Banner

Banner 现在因为网路发达加上疫情,网购变得很稀松平常,而在这些购物网站中一定会出现广告的部分,...