溢位 你想知道的C語言 3 7

2021-10-08 09:12:52 字數 2021 閱讀 6877

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架...