q: 溢位的本質是什麼?
a: 江河漫漫,才華會溢,箱子會滿,人會吃飽。無止境增加一定會滿,事物的有限性,物質和慾望增長一定會撐不住。
q: n位元組無符號整形最大值再加1會變成什麼?
a: 思考1位元組的情形:
unsigned char c = uchar_max;
printf("%d\n", (unsigned char)(c + 1));
0
uchar_max是0xff, 加1等於0x100, 1被丟棄!
0000000100000f66 movb $-0x1, -0x11(%rbp) // 0xff
0000000100000f6a movzbl -0x11(%rbp), %edi // expand to 0x000000ff
0000000100000f6e addl $0x1, %edi // 0x000000ff + 1
0000000100000f71 movb %dil, %al
0000000100000f74 movzbl %al, %esi
0000000100000f77 leaq 0x34(%rip), %rdi
0000000100000f7e movb $0x0, %al
0000000100000f80 callq 0x100000f92
q: n位元組有符號整形最大值再加1會變成什麼?
a: 借用分析整形內部形態的程式:
/*
xi chen([email protected])
cxsjabcabc
*/#include #include void dump_int_bits(int n)
; int orig = n;
for (i = 0; i < 4; ++i)
} printf("%d\n", orig);
for (i = 0; i < 32; ++i)
printf("\n");
}int main(int argc, char *ar**)
輸入: 2147483647
2147483647
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 (msb -> lsb)
輸入: 2147483648
-2147483648
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (msb -> lsb)
2147483647是int_max, 加1之後變成了int_min!
為什麼會出現如何奇怪的現象? 補碼模式是其內因。最高位為1代表負數,使得正數不斷累加一定會變成負數!
q: 如何判斷發生了溢位(有符號數的加減法)?
a: 我們可以用更大的資料儲存來確認是否溢位。我們也可以這樣想,溢位一定發生在最終符號位與計算的兩個數符號位相反了。如果兩個數符號相反,無論如何也不會算出超出最大和最小的數值。
#include #include #include #define pd(s) printf(#s " is: %d\n", (s))
int is_add_overflow(int a, int b)
int main(int argc, char *ar**)
else
return 0;
}
is_add_overflow(2147483647, 1) is: 1
is_add_overflow(2147483646, 1) is: 0
環境: macos 10.14.5 (intel i5)
linux 3.16.83 (ubuntu)
精確度 你想知道的C語言 3 8
q 只要涉及到浮點數,每本書基本都會說它不是精確的,我們該如何理解精確二字?a 精確永遠都是相對而言。當我們認為1 2 3.自然數是精確的,自然c語言中int char都是精確的。如果我們認為1.33是精確的,那麼它就是精確的。那為什麼浮點數會被認為不是精確的呢?以4位元組浮點數為例,符號位 指數字...
你想知道的字元編碼
1 什麼是字元?從顯示的角度來說,字元可以理解成就是我們需要顯示的單一實體。包括,數字6,字母5,中文 好 等等。對字元的其它名詞解釋 字元 character 是文字與符號的總稱,包括文字 圖形符號 數學符號等。2 什麼是字符集?一組字元的集合就是字符集。字符集常常和一種具體的語言文字對應起來,該...
你想知道的負載均衡
本文 一篇文章徹底了解清楚什麼是負載均衡。負載均衡是高可用網路基礎架構的的乙個關鍵組成部分,有了負載均衡,我們通常可以將我們的應用伺服器部署多台,然後通過負載均衡將使用者的請求分發到不同的伺服器用來提高 應用 資料庫或其他服務的效能以及可靠性。為什麼要引入負載均衡?先看乙個沒有負載均衡機制的web架...