為什麼對byte的操作會得到int的結果|代碼|整型|編譯器|windows...

2021-01-10 網易

2020-12-26 10:51:10 來源: 漫漫開發路

舉報

  

  下面的討論,適用於C/C++/C#,我決定使用C#代碼來演示,為什麼?我覺得這段時間對C#這位兄弟的關注還是太少了。

  有些人會抱怨,為什麼下面的代碼會觸發編譯器的警告:

  

  他們會說:「對一個byte的操作,按理說,結果應該也是一個byte呀,為什麼會是一個int?」

  要小心了大兄弟,你要求的東西,可能實際上並不是你真正想要的。

  此話怎講?

  就依你,假設我們生活在這樣一個世界:對任何byte類型變量的操作也會產生byte類型的結果。
如下圖所示:

  

  這這個理想世界,變量i的值將會是16。為什麼?
因為兩個byte類型的變量相加,也會產生一個byte的結果,因為這裡存在整型溢出,所以,你會得到16這個結果。驚不驚喜?

  類似的:int j = -b;
變量j的值實際上是224,而不是你所預期的-32,也是同樣的整型溢出原因導致的。

  所以,請再問問自己,這真的是我想要的嗎?

  讓我們來考察下列更加讓人防不勝防的代碼:

  

  在我們的理想世界中,一旦這場遊戲的次數操作了255,則計算結果就是錯誤的。
為了解決這個問題,你可以這樣解決,雖然看起來代碼有點醜陋了:

  

  所以,無論你如何精簡代碼,你都不得不添加上述這些強制類型轉換的代碼。
讓我這樣說白了吧:出於安全方面的考慮而出現的語法錯誤(例如,你知道不會產生溢出,但是你不得不加上強制類型轉換),比那些根本摸不著頭腦的運行時錯誤(例如,你忘記在計算工資的代碼中添加類型轉換,直到財務部的大姐問你為什麼本月工資發錯數了),要好吧。

  總結

  行,服了。
我們還是回到這個世界吧:對byte的操作會得到int的結果。

  最後

  Raymond Chen的《The Old New Thing》是我非常喜歡的博客之一,裡面有很多關於Windows的小知識,對於廣大Windows平臺開發者來說,確實十分有幫助。
本文來自:《Why do operations on 「byte」 result in 「int」?》

  

特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺「網易號」用戶上傳並發布,本平臺僅提供信息存儲服務。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關焦點

  • 深入剖析go中字符串的編碼問題——特殊字符的string怎麼轉byte?
    go中的字符眾所周知,go中能表示字符的有兩種類型,分別是byte和rune,byte和rune的定義分別是:type byte = uint8和type rune = int32。我們用下面的代碼來驗證:上述的程序根本無法運行,因為第二行編譯會報錯,vscode給到了十分詳細的提示:'新' (untyped rune constant 26032) overflows byte。
  • python的內置函數:int()轉換成整型
    前言在Java中有強制類型轉換,我們可以利用Integer.parseInt()將一個對象轉換成int類型。在python中是利用內置函數int()來將一個對象轉換成整型。python的內置函數int的使用1.內置函數int()語法classint(x,base=10),其中x為一個字符串或數字,base來表示x是以什麼進位的數據來表示的。x數字參數可以是整數、浮點數(小數點表示和指數e表示皆可), 字符串參數僅能包含在指定進位下所涵蓋的字符,該參數可省略。
  • int 和 integer:裝箱和拆箱的過程,會用到什麼方法
    場景一、將基本數據類型放入集合類我們知道,Java中的集合類只能接收對象類型,那麼以下代碼為什麼會不報錯呢?反編譯後代碼如下:boolean flag = true;Integer i = Integer.valueOf(0);int j = 1;int k = flag ? i.intValue() : j;這其實是三目運算符的語法規範:當第二,第三位操作數分別為基本類型和對象時,其中的對象就會拆箱為基本類型進行操作。因為例子中,flag ?
  • 為什麼Julia比Python快?因為天生理念就更先進啊
    許多人認為 Julia 快是因為它使用的是 JIT 編譯器,即每一條語句在使用前都先使用編譯函數進行編譯,不論是預先馬上編譯或之前先緩存編譯。這就產生了一個問題,即 Python/R 和 MATLAB 等腳本語言同樣可以使用 JIT 編譯器,這些編譯器的優化時間甚至比 Julia 語言都要久。所以為什麼我們會瘋狂相信 Julia 語言短時間的優化就要超過其它腳本語言?
  • 奇怪的C語言代碼,在變量前加上(void)是什麼操作?有什麼用?
    }在編譯這段C語言代碼時,編譯器常常會給出下面這樣的「參數未使用(unused parameter)」警告信息:t.c: In function 『fun』:t.c:3:22: warning: unused parameter 『ud』 [-Wunused-parameter
  • python的int類型專題及常見問題 - CSDN
    在以前的Python2中,整型分為int和long,也就是整型和長整型, 長整型不存在溢出問題, 即可以存放任意大小的數值,理論支持無限大數字。因此在Python3 中,統一使用長整型,用int表示,在Python3中不存在long,只有int。
  • DSP編程技巧之24---C/C++與彙編語言的交互之-(2)從C/C++代碼調用...
    在C/C++與彙編語言混合編程的情況下,一般我們都會選擇C/C++來實現所期待的大部分功能,對於少數和硬體關聯度高(例如操作某些CPU寄存器)以及對運算的實時性要求高(例如高速、多點的FFT)的功能才使用彙編來實現,這就使得大多數情況下,C/C++與彙編的交互都是從C/C++代碼調用彙編代碼中的函數與變量,所以在此我們就來看一下這種調用的規則。
  • 教孩子寫遊戲:手寫一個最最簡單的Windows程序框架
    首先,我們看一看Windows程序框架的完整原始碼:#include <windows.h>#include <windowsx.h>#include <tchar.h>//函數聲明LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);//
  • C語言陷阱與技巧第13節,1位元組(Byte)一定等於8位(bit)嗎?C語言操作...
    甚至,一些「摳門」的C語言程式設計師會將 1 個字節掰成若干個位(bit)使用。>上面第二行C語言代碼將 status 的第3個位(bit 2)設置為 1,第三行C語言代碼將 status 的第1個位(bit 0)設置為 0。