iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 4
0
Software Development

30天手把手帶你跟JAVA變成好朋友 系列 第 4

Day4 - 運算元、運算子與奇妙的型態轉換

  • 分享至 

  • xImage
  •  

在撰寫程式的過程中,我們不可避免的一定會用到許多四則運算,像是算圓周率、標準差....等等。

這時候,我們就必須知道 "+"、 "-" 、"*"、 "/" 、"="、"&" 在程式中所代表的意義。

在程式語言中,這些統稱為運算子 -

  • 算術運算子 : +、-、*、/
  • 比較、條件運算子 : >、>=、、<=、==、!=
  • 邏輯運算子 : &&(AND)、| |(OR)、!(NOT)
  • 左移、右移運算子 : >>、<<
  • 指定運算子 : +=、-=、*=、/=、%=、>>=、<<=

比較不容易理解的是左移及右移運算子,舉例來說,假設有一個變數a = 1,

而a>>1及a<<1會等於多少呢?

首先,我們要將a拆解為八個位數,原因是因為一個位元組(byte)可以表示0-255 的數字,一個位元(bit)則有0與1的兩種組合,因此,2^8 = 256,就有這麼多組合了。

因此,a = 00000001,而右移1則代表著,這個位元組往右平移1,最右邊的1被刪去,左邊多出來的補0,最後結果為,a = 00000000,換算為十進位數字就變成0了

https://ithelp.ithome.com.tw/upload/images/20200917/20128925k5WYVdubil.png

https://ithelp.ithome.com.tw/upload/images/20200917/20128925w1xVY0PnyS.png

再來,a = 00000001,而左移1則代表著,這個位元組往左平移1,最左邊邊的0被刪去,左邊多出來的補0,最後結果為,a = 00000010,換算為十進位數字就變成2了。

https://ithelp.ithome.com.tw/upload/images/20200917/20128925Fa5iJuVW3u.png

https://ithelp.ithome.com.tw/upload/images/20200917/201289251bjiYUYyyX.png
接下來,我們來看一下Java中奇妙的型態轉換特性囉!

Java的型態轉換分為"自動轉型"與"強制轉型"兩種

1. 自動轉型 -

在自動轉型中,有一個非常重要的特性,叫做 Promote 晉升。
當運算式中包含不同型態數值時,則運算時以長度最長的型態為主,其他數值將會自動promote型態

提升(晉升)有以下特性:

  • 當運算式中包含不同型態數值時,則運算時以長度最長的型態為主,其他數值將會自動promote型態。

int a = 2;

double b = 0.66;

double c = a * b;

a為int型態(4 bytes) 而 b為double型態(8 bytes),當a與b進行運算時,c自動被promote成double型態。(因為double>int)

  • 如果運算元都是不大於int的整數,則自動提升為int。

short a = 1;

short b = 2;

short c = a + b;

https://ithelp.ithome.com.tw/upload/images/20200917/20128925euMoo6JGfA.png

假設你不知道提升的特性,這裡就會報錯了

2. 強制轉型 -

強制轉型的意思就是透過程式手法強迫將不是那個型態的變數轉換成該型態的變數。

例如:

short a =1;

long b = 2;

int c = (int)(a+b);

But! 要注意的是,強制轉型的風險是,把數值範圍比較大的資料強制轉換為數值範圍比較小的型別, 因此有可能在轉型後造成資料數值不正確。

很奇妙吧~~ 如果不知道程式背後的原理,可能會覺得,咦! 這樣宣告明明沒錯R,怎麼會報J個錯誤呢QQ

下一篇將講解何謂流程控制。


Hi, I am Grant.

個人部落格 - https://grantliblog.wordpress.com/
個人網站 - https://grantli-website.netlify.app/#/mainpage
我的寫作專題 - https://vocus.cc/user/5af2e9b5fd89780001822db4#


上一篇
Day3 - Java基本型態、變數命名與宣告
下一篇
Day5 - 透過流程控制實現程式的邏輯
系列文
30天手把手帶你跟JAVA變成好朋友 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言