」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 每週部落格:本週我遇到的四件有趣的事情

每週部落格:本週我遇到的四件有趣的事情

發佈於2024-11-08
瀏覽:179

1. 避免 VS Code 中檔案名稱混淆

在VS Code中編寫C檔案時,我將一個檔案命名為first.c.cpp。完成程式後,我在執行過程中遇到了錯誤。經過30分鐘的檢查,我發現問題出在檔名:
.c 副檔名導致 IDE 錯誤地將其識別為 C 程序,導致 VS Code 使用 gcc(C 編譯器)而不是 g(C 編譯器)來編譯我的程式碼。

Weekly Blog: Four Interesting Things I Encountered This Week

說明文字:真傻!

  • 解決方案:在tasks.json檔案中,將「命令列」行從 gcc 更改為 g .
  • 經驗教訓:對 C 檔案使用清晰的 .cpp 副檔名以避免不必要的混亂。

2.Java的跨平台設計理念

Java的設計概念與傳統編譯型語言有顯著不同:

傳統編譯:

  1. 像C這樣的語言直接編譯成特定的機器碼 平台(如 Windows、Mac、Linux)
  2. 產生的可執行檔(.exe)只能在目標平台上執行

Java的方法:

  1. 編譯器產生中間代碼(字節碼)
  2. 此字節碼可以在任何安裝了 Java 虛擬機器 (JVM) 的平台上執行
  3. JVM負責將字節碼翻譯成目前平台的機器碼

這種設計實現了「一次編寫,隨處運行」的目標,而 C 可執行檔(.exe 檔案)僅限於在單一平台上運行。

  • 優點:同一個程式無需修改即可在不同電腦上運行

  • 缺點:與傳統方法相比,流程中的額外步驟可能會使編譯速度稍微慢一些

一次編寫,隨處運行

                             ---------James Gosling

3. 兩種常見的編譯模式

  • 調試模式面向調試,優化較少。主要用於調試程式。
  • Release模式主要用於產生release版本,注重最佳化,只保留基本的調試功能。

Weekly Blog: Four Interesting Things I Encountered This Week

4. 從底層角度理解強制類型轉換

Little Endian:最低有效位元組儲存在最低位址。這種儲存方法的出現是為了方便CPU從低位址到高位址讀取記憶體。有趣的是,這與人類通常寫數字相反。
例如
329933 的二進位表示為 00000000 00000101 00001000 11001101
小端儲存:11001101 00001000 00000101 00000000
正如我們所看到的,Little Endian 顛倒了二進位表示中的位元組順序。然而,重要的是要注意每個位元組內的位元順序保持不變!

一個了解強制類型轉換的有趣遊戲

我最喜歡的引入類型轉換的實驗!

# include 
int main()

{
    int a;

    int *p;

    a=329933;

    p=&a;

    char *q;

    q=(char*)p;

    printf("%d\n",*p);

    printf("%d\n",*q);

}

輸出:

329933
-51

我很好奇為什麼它輸出-51?

解釋

  1. (char*)&a 指向 int 的第一個位元組。第一個位元組 11001101 被解釋為字元。
  2. 最高位1表示負數,補碼轉換後得到-51(熟悉補碼的朋友可以驗證是否確實代表-51)

這是巧合嗎?讓我們再試試兩個例子

printf("%d\n",*(q 1));
printf("%d\n",*(q 2));

試試看:

  1. 嘗試運行上面提到的程式碼並觀察輸出。
  2. 考慮為什麼第二個和第三個位元組會產生這樣的輸出。 歡迎在評論區討論這個問題。
  3. 您可以將強制型別轉換套用至其他資料型別嗎?快來試試吧!

附加資訊:補碼

執行強制型別轉換時,(char)p將指向四位元組int的第一個位元組的位址,即11001101。
最左邊的1代表負號,表示是負數。應用二進位補碼後,我們得到:0110011(最後 7 位元)

(註:對於正數,二進制補碼就是十進制數的二進位表示。對於負數,二進制補碼是將除最左邊(最高)位之外的所有位取反,然後加1 得到的到最右邊的位子。 將其轉換為十進制得到-51。有趣吧?

補碼的好處:

它允許僅使用加法器來計算正數和整數類型,從而無需減法器並簡化硬體需求。
  1. 它為零提供了唯一的二進位表示形式。 10000000不代表-0,而是-128,而00000000代表0,不是0。
很多人想知道為什麼是-128。如果你知道答案,歡迎在留言區分享。這不僅可以幫助別人,還可以幫助你整理思緒。

版本聲明 本文轉載於:https://dev.to/stockdale_roger_999e292a7/weekly-blog-four-interesting-things-i-encountered-this-week-eo9?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何在 Golang 中處理貨幣格式?
    如何在 Golang 中處理貨幣格式?
    Golang 中正確的貨幣格式使用貨幣格式時,必須考慮每種貨幣和語言組合的具體要求。使用 golang.org/x/text/currency,您可以根據本機約定輕鬆格式化值。但是,您在獲得所需的輸出時可能會遇到一些挑戰。 使用貨幣符號在您的代碼中,您使用currency.Symbol 來檢索貨幣符...
    程式設計 發佈於2024-11-08
  • 為什麼在 CSS 類別名稱中使用反斜杠,如 \".container.\\31 25\\25\"?
    為什麼在 CSS 類別名稱中使用反斜杠,如 \".container.\\31 25\\25\"?
    CSS的「.container.\31 25\25」中反斜線字元的用途是什麼? 在提供的CSS代碼中,反斜線字元 () 具有與識別符轉義相關的特定目的。根據CSS規範:轉義特殊字元: 反斜線可以取消CSS特殊字元的意思。在這種情況下,它可以防止百分號 (%) 被識別為 CSS 計算的開始。 數字代碼...
    程式設計 發佈於2024-11-08
  • 如何在 JavaScript 中將多個數字組合併為一個?
    如何在 JavaScript 中將多個數字組合併為一個?
    將陣列項目連接成單一陣列在JavaScript 中,將多個陣列的元素組合成一個新陣列可能是一種常見的需求。實現此目的的一種方法是使用循環迭代每個來源數組並將項目推入目標數組。然而,這種方法可能乏味且效率低。 利用「concat」函數幸運的是,JavaScript 提供了一個更簡單、更優雅的解決方案:...
    程式設計 發佈於2024-11-08
  • ## 為什麼我不能在 Go 中只複製帶有指標接收器的類型實例?
    ## 為什麼我不能在 Go 中只複製帶有指標接收器的類型實例?
    了解指標接收器和複製實例在 Go 中,可以使用值接收器或指標接收器來定義方法。當類型 T 的所有方法都有 T 本身的接收者類型時,複製該類型的實例是安全的,因為呼叫其任何方法都必然會進行複製。 然而,當類型有帶有指標接收器的方法。在這種情況下,應避免複製該類型的實例,因為它可能違反內部不變量。 複製...
    程式設計 發佈於2024-11-08
  • Java 中的建構函式重載
    Java 中的建構函式重載
    建構子在初始化類別中扮演至關重要的角色。但您是否知道在 Java 中,一個類別可以有多個建構函式?這個概念稱為建構函數重載,該功能可讓您根據提供的參數以不同的方式建立物件。在本文中,我們將深入探討建構函式重載,探討其好處,並查看實際範例。 什麼是構造函數重載? 建構子重載在Java...
    程式設計 發佈於2024-11-08
  • 如何使用 Python 函式庫維護 JSON 物件中鍵的順序?
    如何使用 Python 函式庫維護 JSON 物件中鍵的順序?
    使用Python 庫保留JSON 物件屬性的順序使用json.dumps 將Python 物件轉換為JSON 字串時,輸出JSON 物件中鍵的順序可能與輸入Python 物件中鍵的原始順序不一致。如果需要特定的鍵順序,這可能會出現問題。 要解決此問題,您可以利用某些 Python 庫,它們提供了維護...
    程式設計 發佈於2024-11-08
  • ## 什麼是 __construct 方法以及它在 PHP 中如何運作?
    ## 什麼是 __construct 方法以及它在 PHP 中如何運作?
    理解__construct在類別定義中的作用理解__construct在類別定義中的作用在物件導向程式設計中,__construct方法在類別定義中起著至關重要的作用。它作為構造函數,負責在創建物件時初始化和設定物件的屬性。 什麼是 __construct? __construct 是 PHP5 中...
    程式設計 發佈於2024-11-08
  • 如何在 C++ 中傳遞給非主函數的陣列上使用基於範圍的 for 迴圈?
    如何在 C++ 中傳遞給非主函數的陣列上使用基於範圍的 for 迴圈?
    傳遞給非主函數的數組上基於範圍的for 循環在C 中,基於範圍的for 循環可以是用於迭代數組。但是,當數組傳遞給非主函數時,它會衰減為指針,從而失去其大小資訊。 要解決此問題並啟用基於範圍的 for 循環,數組應該被引用而不是作為指標傳遞。這保留了數組的大小資訊。以下是示範正確方法的修改範例:vo...
    程式設計 發佈於2024-11-08
  • 使用 Python 進行詞嵌入:Wordc
    使用 Python 進行詞嵌入:Wordc
    使用 Python(和 Gensim)實現 word2vec 注意:此程式碼是用Python 3.6.1(Gensim 2.3.0)編寫的 word2vec與Gensim的Python實現及應用 原文:Mikolov, T.、Chen, K.、Corrado, G. 與 Dean,...
    程式設計 發佈於2024-11-08
  • 如何解決 C# 中 MySQL UTF-8 資料的編碼問題?
    如何解決 C# 中 MySQL UTF-8 資料的編碼問題?
    MySQL 和C# 中的編碼問題在您的專案中,從以UTF 編碼的MySQL 資料庫檢索資料時遇到字元差異-8 使用ADO.Net實體框架。具體來說,像“ë”這樣的字元顯示為“à”。 可能的解決方案要修正此問題,有兩個關鍵步驟: 1。驗證資料庫排序規則確保資料庫或表格的排序規則設定為 UTF-8 排序...
    程式設計 發佈於2024-11-08
  • 適合初學者的 VueJs VueJs 部分創建、導入和使用元件
    適合初學者的 VueJs VueJs 部分創建、導入和使用元件
    創建您的第一個組件 什麼是組件? 元件是 Vue 應用程式的建構塊。每個元件都有自己的功能和視圖,元件可以在整個應用程式中重複使用。組件的一個範例是可以在不同頁面上存取的導覽列。 建立基本元件 在元件資料夾中建立一個名為 HelloWorld.vue 的新元件檔案(如果需要,您...
    程式設計 發佈於2024-11-08
  • 如何在Python中為共享模組創建命名空間包?
    如何在Python中為共享模組創建命名空間包?
    在Python 中創建命名空間包以進行共享模組分發簡介在Python 中,命名空間包是分發相關模組的便捷方法。它們使多個 Python 產品能夠在同一命名空間中定義模組,從而允許最終用戶無縫導入它們。 實作命名空間包Python 3.3 中的隱式命名空間包從Python 3.3開始,引入了隱式命名空...
    程式設計 發佈於2024-11-08
  • 資料庫設計中「n:m」和「1:n」關係有什麼不同?
    資料庫設計中「n:m」和「1:n」關係有什麼不同?
    資料庫設計:闡明「n:m」與「1:n」關係的意義在資料庫設計領域,實體之間的關係是根本性的。理解用於描述這些關係的符號對於創建健壯且高效的資料庫結構至關重要。兩個常見的符號是「n:m」和「1:n」。 n:m 關係:多對多連結An "n :m」關係表示兩個表之間的多對多關係。這意味著一個表中...
    程式設計 發佈於2024-11-08
  • 如何在 CSS 中縮排後續換行標籤行?
    如何在 CSS 中縮排後續換行標籤行?
    縮排換行標籤文字的後續行當面臨表單寬度的限制時,標籤文字可以換行到多行,從而美觀的擔憂。雖然第一行由於輸入元素的存在而縮進,但後續行可能不會縮進,從而產生不均勻的外觀。 要僅使用CSS 實現縮排的第二行和後續行,請考慮使用以下方法:要僅使用CSS 實現縮排的第二行和後續行,請考慮使用以下方法:將輸入...
    程式設計 發佈於2024-11-08
  • 掌握 CSS 中的 box-shadow:快速指南
    掌握 CSS 中的 box-shadow:快速指南
    CSS 中的 box-shadow 屬性是開發人員向 HTML 元素引入深度和維度的有效機制。透過將陰影合併到元素中,可以增強使用者介面的真實感和視覺吸引力。本文將深入探討 box-shadow 的基礎知識,並提供範例來幫助您掌握其應用程式。 了解基礎 box-shadow 屬性...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3