目錄html
目錄linux
&
, |
, |
, ^
;&&
, ||
, !
;在轉換時, 位模式中每一位的數值是同樣的、不改變的;改變的是最高位(有符號數符號位、無符號數最高有效位)的權值。git
表達式 | 類型 | 求值 |
---|---|---|
-2147483647-1 == 2147483648U | ( _____________________ ) | ( _____________________ ) |
-2147483647-1 < 2147483647 | ( _____________________ ) | ( _____________________ ) |
-2147483647-1U < 2147483647 | ( _____________________ ) | ( _____________________ ) |
-2147483647-1 < -2147483647 | ( _____________________ ) | ( _____________________ ) |
-2147483647-1U < -2147483647 | ( _____________________ ) | ( _____________________ ) |
問題緣由分析:
-2147483647-1
值得是C語言中 TMin 的寫法,不可簡單寫成 0x80000000
。
仍是沒有搞懂:數值絕對值相同的狀況下,正數與負數之間的轉換。
除0之外,符號位取反,數值位按位取反,再+1;便可將正數(或負數)轉換爲負數(或正數)。
例如:
第5個小題:-2147483647-1U
爲 0x80000000
(2^31), +2147483647
爲 0x7FFFFFFF
((2^31)-1) ,-2147483647
爲 0x7FFFFFFF
符號位取反(==0xFFFFFFFF
),數值位按位取反(==0x80000000
),再+1(==0x80000001
)。因爲是無符號數與有符號數之間的比較,有符號數按無符號數看,因此-2147483647-1U < -2147483647
爲 0x01
。正則表達式
問題解決方案:安全
表達式 | 類型 | 求值 |
---|---|---|
-2147483647-1 == 2147483648U | 無符號數 | 0x01 |
-2147483647-1 < 2147483647 | 有符號數 | 0x01 |
-2147483647-1U < 2147483647 | 無符號數 | 0x00 |
-2147483647-1 < -2147483647 | 有符號數 | 0x01 |
-2147483647-1U < -2147483647 | 無符號數 | 0x01 |
疑惑:
1 - 1
的存在溢出麼?
[0001] - [0001] = [0000]
對麼?學習
疑惑解答:
1 - 1
的存在溢出。
[0001] - [0001] = [0000]
錯誤。
對於無符號數而言,減法直接借位減。但對於有符號數來講,被減數爲負數時,是加上該負數的補碼。
這麼來講的話, 1 - 1
的二進制過程爲:
[0001] + [1111] = [10000]
截斷4位以後爲 [0000]
,此時是溢出。編碼
運行以下實例:.net
# include <stdio.h> int tadd_ok(int x, int y); int main() { printf("%d\n",tadd_ok(0X00000001, 0x8FFFFFFF)); printf("%d\n",tadd_ok(1, -1)); } int tadd_ok(int x, int y) { int sum = x+y; int neg_over = x < 0 && y < 0 && sum >= 0; int pos_over = x >= 0 && y >= 0 && sum < 0; return !neg_over && !pos_over; }
結果:設計
Linux> ./a.out 1 1
對應倉庫網頁連接:https://gitee.com/Yogile/Cpt_System_Yogilecode
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 4000行 | 20篇 | 280小時 | |
第一週 | 66/66 | 1/1 | 24/24 | |
第二週 | 427/493 | 2/3 | 25/49 |
計劃學習時間:16小時
實際學習時間:25小時