c#入門-型別轉換和運算

詹姆士x發表於2020-12-28

變數在宣告的時候需要寫他的變數型別,這意味著這個變數不能隨意儲存其他型別的值
在這裡插入圖片描述

但是不同型別之間,可以定義他們的型別轉換。
之前的數值型別中預設了一些型別轉換
如果一個型別的範圍完全屬於另一個型別的範圍,那麼可以隱式轉換
其他的可以使用顯式轉換

隱式轉換即可以不加修飾地轉換型別
顯式轉換在前面加括號,裡面寫目標型別
在這裡插入圖片描述
*最後一個轉化成了byte,然後再隱式轉換ushort

預定義的隱式轉換總是會成功,從來不會導致引發異常。正確設計的使用者定義隱式轉換同樣應表現出這些特性。

不是隱式轉換的顯式轉換是這樣的一類轉換:它們不能保證總是成功,知道有可能丟失資訊,變換前後的型別顯著不同,以至值得使用顯式表示法。
顯式轉換集包括所有隱式轉換。這意味著允許使用冗餘的強制轉換表示式。

不存在從其他型別到 char 型別的隱式轉換。具體而言,即使 sbyte、byte 和 ushort 型別具有完全可以用 char 型別來表示的值範圍,也不存在從 sbyte、byte 或 ushort 到 char 的隱式轉換。

在c#中,char不能隱式轉換為string型別


使用運算子的運算也是可以自定義的,對於數字的運算方式不多講
一共有+ -* / %5種運算。最後一個是獲得餘數
先括號,再乘除,再加減,和普通的數學一樣。
主要問題還是型別問題

1.整數的除法不會保留餘數或小數
比如5/3=1

2.不同數字型別運算時會先轉為較大的型別再運算
比如5/3.0=1.66666
3.0是double型別,5是int型別。會先將5變成double型別再計算,於是會得到小數
在這裡插入圖片描述

3.運算存在溢位
在這裡插入圖片描述
運算不會對溢位做檢測,這不屬於錯誤。
如果你自己不做一些保障措施,那麼程式的執行可能與期望不符

4字串的運算
任何型別都可以轉化為字串(輸出語句裡的東西都是轉為字串才輸出的)
字串在和別的型別相加時會自動的使其轉為字串
字串的+是連線兩個字串
在這裡插入圖片描述
但這種轉換隻寫在運算子的定義裡面
沒有寫在型別轉換的定義裡面,所以不能直接用其他型別來賦值

字串的運算子只定義了+,你不能*/-
在這裡插入圖片描述
5char型別可以轉換為數字
char可以和數字型別做運算,他會轉換成int,即便只需要ushort型別就能覆蓋範圍
在這裡插入圖片描述

6.運算順序
在計算表示式時會依次按照順序計算,不會一步到位
在這裡插入圖片描述
首先i和i2用整數的除法不保留小數得到7
然後7轉換成double和4做除法得到1.75
最後1.75再和字串a相加得到1.75a

不會一開始就全部轉成string
在這裡插入圖片描述


補碼(擴充套件知識
為什麼sbyte型別的範圍是-128-127呢,其他型別的也是負數範圍比正數多,明明我們用正數更多啊
因為計算機中數字是使用補碼儲存的

首先你要知道一件事:CPU不能算減法
那他要如何算減法呢?

如果你的錶快了20分鐘,你該怎麼做?有兩種方法
一:調慢20分鐘
二:調快40分鐘(或11小時40分鐘)

對,數字型別都是有周期的。所有負數都是一個特別大的,馬上就要溢位的數
在這裡插入圖片描述
數字溢位不屬於錯誤,因為每計算一次減法都要溢位一次。
數字的計算,本來就是建立在溢位之上的。

然後你要知道第二件事:符號位(最高位)為1的時候是負數
在這裡插入圖片描述
用補碼的第二個好處:符號位也直接參與運算而無需單獨拿出來(第一個好處:解決了算減法的問題)
算乘法的時候後面的1會往左補到符號位

1111 比如這是4位元的-1,*2了以後會變成1110也就是-2
這些1全部往左移了一位,最開始的符號位溢位了,但是右邊有1補上
所以結果還是一個負數


回到最開始的問題,為什麼負數範圍比正數大
因為+0和-0是一樣的,不需要符號位,所以有一個會多1

為什麼是負數多1而不是常用的整數,不能挪過去嗎?
基於這種有規律的儲存方式,是挪不了。

相關文章