淺談 C 語言的型態轉換

前言

最近公司專案導入 static code check tool 並且採用較嚴格的 coding rule 來檢查,團隊內不乏許多資深的工程師,但檢查出相當多型態轉換的問題,促使我想寫下這篇文章釐清 C 語言型態轉換的規則及可能的問題。

可能的安全問題

C語言包含不同的型態,不同型態之間做運算就會適用不同規則,這也是 C 語言型態轉換困難的地方,進行型態轉換,可能會發生以下問題是值得我們留意的

  • loss of value: 如果今天我們將 integer 轉換到 char 型態,由於 int 型態大小遠大於 char,就會造成這種狀況
  • loss of sign: 如果我們將 unsigned int 與 signed int 進行運算,原本 signed int 被迫轉換成 unsigned int,就會造成這種狀況
  • loss of precision: 從 floating 型態轉換到 integer 型態
  • loss of layout: 型態轉換發生在從 pointer to struct 到 pointer to char

型態轉換又分為兩種:

  1. explicit conversion: 就是大家會在教科書上看到的 cast,開發者可以強制轉換任何資料的 data type。
  2. implicit conversion: 這是大部分開發者都會疏忽的,由 compiler 來幫你轉換型態,以下會描述什麼情況下會發生 implicit conversion,我們並不需要牢記這些規則,但必須要在開發時候隨時留意。

閱讀全文〈淺談 C 語言的型態轉換〉

成大 2019 linux 程式設計 week2

將近兩個月後才更新了這次進度,中間過程中經歷了換新電腦,一度暫停一段時間。

這次的課程兩大作業花了我許久時間, linux 相關知識在過去學生階段接觸較少,透過課程資料讓我有系統地學習。

在這段時間我也修了一門 udemy 課程重新複習資料結構與演算法,講師用很有系統的方式歸納如何利用資料結構與演算法來面對不同的問題,這門課在 udemy 上有 4.7 顆星的高分,這門課我覺得相當推薦,對我來說缺點是他以 javascript 來講課。

接下來會花點時間彙整一下這段時間學習內容記錄在這個 blog,有餘力的話準備刷刷 leetcode 並參與開源專案,期許自己在這段時間不斷累積。

成大 2019 linux 程式設計 week1

花了三週的時間將整個課程教材與作業做完。
第一週的課程有以下的體悟:

有品味:如何把程式寫的有品味應該是第一週課程給我最大的體悟,也認知到平常寫程式毫無品味可言,根本只是會動的程度,

學習新事物:發現這一週所學的新東西,可能比過去半年來學的還多,也讓我認清楚一件事情,在工作上我可能真的只是一個程式碼輸出人員,遇到 bug 我可以 google,問題通常都能解決,當然花的時間就.......

紮實的基礎:寫作業的過程中,深刻體會到自己基礎是相當不扎實,過去自己需要用到什麼功能,總是 google 到用法,就直接使用了,從未試著看看他的規格書,瞭解他的每個參數以及每個輸出的意義,或許我自己寫程式一直犯了老師在課程影片中一直說的「舉燭」,總是一直半解的拼湊出能動的程式,不追求更好的規格、不去思考所謂的corner case。

身為一個上班族,要利用下班時間進修確實一件相當困難的事,除了晚上精神可能比較差,因為加班而縮短學習的時間,也會因為幾天都沒有進度而壓力大到影響平常作息,時間過於零碎也會造成效率無法有效提升,接下來進行第二週課程期許自己能夠有穩定的作息,按部就班完成課程。