將8位的有符號數強轉64位的無符號數的坑

2021-08-19 06:06:26 字數 516 閱讀 7093

今天在做公司大資料分析時遇到個坑,某些資料莫名其妙變得特別大:

最終定位出原因在這個強轉這裡

當8位有符號數擴充套件為64位無符號數時,底層彙編實際上使用的是movsx帶符號擴充套件指令,意思就是擴充套件的那些位都用符位來補全,這裡就造成了value的高58位全為1,從而值異常大。

我們再來做個簡單測試:

-29和157的二進位制是一樣的10011101,為何強轉後的值不一樣,原因在於計算機記憶體負數的方式為補碼,所以實際上-29的記憶體為11100011,157的記憶體為10011101,它們在強轉為無符號64位後分別為上圖中的值。

下面我是這樣解決這個問題的,先強轉型別,再取內容,這樣相當於從無符號轉為無符號型別,底層使用的movzx指令,在轉換過程中高位都由零填充。

8位有符號數的取值範圍

首先我們知道,計算機以補碼的形式儲存的,正數的補碼是原碼不變,負數的補碼是原 碼的取反加1。我們先來看 127,原碼0111 1111對吧,若 128是多少呢,0111 1111 1 1000 0000 原碼 然後儲存時,計算機一看是最高位為1,就保持符號位不變,後面7位取反加 1,然後呢,進製捨棄...

有符號數的符號位擴充套件

char和int型別都是由符號數型別,char型別的變數佔據1個位元組的容量,int型別的變數佔據4個位元組的容量。那麼,把char型別變數賦給int型別變數,會有什麼問題產生?我們會很直觀地認為,把1個位元組大小的資料,放入4個位元組大小的容量,沒有任何問題啊!我們做如下的乙個測試例子 inclu...

有符號位和無符號位。 int8疑問有感

學習go語言的資料型別,看見int int8 int16很是疑惑,int8是什麼意思?查詢資料進行綜合解釋大概如下 int8是有符號位8位整形 128到127 隨即產生疑惑,為什麼負數可表示到 128,正數只能127,少一位是為什麼?解答 有符號位的表達形式是最高位是符號位,其餘是數值,正數的表達方...