c#入門-型別轉換和運算
變數在宣告的時候需要寫他的變數型別,這意味著這個變數不能隨意儲存其他型別的值
但是不同型別之間,可以定義他們的型別轉換。
之前的數值型別中預設了一些型別轉換
如果一個型別的範圍完全屬於另一個型別的範圍,那麼可以隱式轉換
其他的可以使用顯式轉換
隱式轉換即可以不加修飾地轉換型別
顯式轉換在前面加括號,裡面寫目標型別
*最後一個轉化成了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而不是常用的整數,不能挪過去嗎?
基於這種有規律的儲存方式,是挪不了。
相關文章
- C#快速入門教程(9)——浮點數、Decimal型別和數值型別轉換C#Decimal型別
- Java入門系列-05-資料型別和型別轉換Java資料型別
- C# 型別轉換C#型別
- C#快速入門教程(10)——布林型別與布林運算C#型別
- 型別轉換運算子型別
- c++primer——過載運算與型別轉換C++型別
- 瞭解下C# 型別轉換C#型別
- C#學習 [型別系統] 型別轉換(11)C#型別
- 【型別轉換】使用c#實現簡易的型別轉換(Emit,Expression,反射)型別C#MITExpress反射
- C#快速入門教程(11)—— 字元和字串型別C#字元字串型別
- golang 快速入門 [8.4]-常量與隱式型別轉換Golang型別
- 型別轉換(int 和 String)型別
- mysql bigint型別和datetime型別的轉換MySql型別
- C#資料型別及其轉換詳解C#資料型別
- C語言中,四則運算導致資料型別的轉換C語言資料型別
- [Python影象處理] 五.影象融合、加法運算及影象型別轉換Python型別
- C# 泛型中的資料型別判定與轉換C#泛型資料型別
- 型別轉換型別
- java- 型別-轉換:基本型別以及包裝型別的轉換Java型別
- C#快速入門教程(22)—— 常用集合型別C#型別
- Js型別轉換之相等運算子[初級]JS型別
- 資料型別,型別轉換資料型別
- scala和java資料型別轉換Java資料型別
- PHP入門之型別與運算子(一)PHP型別
- 型別轉換(cast)型別AST
- Convert型別轉換型別
- js型別轉換JS型別
- C#快速入門教程(7)——資料型別概述C#資料型別
- python資料型別和四則運算Python資料型別
- Java資料型別的顯式轉換和隱式轉換Java資料型別
- 函式匹配和實參型別轉換函式型別
- Java中String和byte型別互相轉換Java型別
- Map和String型別之間的轉換型別
- C# 左移右移在資料型別轉換中的使用C#資料型別
- Java資料型別及型別轉換Java資料型別
- golang的型別轉換Golang型別
- 型別轉換工具類型別
- c++ 型別轉換C++型別