A. 為什麼c中會溢出
從c語言的內部處理機制來如悶說,int型數超出范圍(溢出)被認為是一個正常現象,只會產生錯誤的計算結果或邏輯錯誤,而不會觸發數據溢出的異常。因此,為了避免因為整數溢出而產生程序邏輯或計算錯誤,程序員必須自行檢測可能渣滲彎出現的溢出或者確保不會出現數據溢出的情況。
C語言對於int類型數據超出范圍的處理,只有一個最簡單的原則:截斷處理,即超出int位長度范圍的高位元組被自動截掉。
比如,假設int長度為16位的情況下,以下代碼:
int
a=0X77FFFFL;
/*
由於超出范圍,高位的77將被自動截掉,實喊衫際的a將會等於0xFFFF
*/
++a;
/*
a自增後,將超出范圍,高位的1被截掉,實際a=0
*/
B. 用C語言求20的階乘,為什麼會有溢出啊
因慧團為階乘50太大了,變數存不下,所以最後顯示0,如果你將階乘數改小一點就沒問題了,比如10
或者將int型改成塌橘long
long型,然後結果已%lld輸出,但40、50的階乘也無法容納,因為結果前衫橘太大了,20、30還可以
C. C語言數據溢出
int
型
佔4位元組(所佔位元組和編譯器有關的,此處所說的是在VC上,比如在TC或BC上佔2位元組)
有符號
int
范圍
-2^31~2^31-1
無符號
int
范圍
0~2^32-1
如果超出這個范圍就會溢出
D. c語言數據類型方面的問題,請大家看看為什麼計算會溢出
你是想讓他們做乘法運算嗎?如迅敗果是的話,你需要改成這樣: (signed int)(((signed long)0x00fb8c00*(畝櫻顫(signed long)0x00666666))>>24);
因為在C語言頌搏運算裡面,取值*運算符的優先順序最高,所以變成了這樣:(signed int)(((signed long)0x00fb8c00(*(signed long)0x00666666))>>24); 會把0x00666666地址裡面的signed long型的數據讀取出來在進行運算。所以會報錯!
E. C語言關於數據溢出
這不是數據溢出。這是由於沒有指定小數位數(系統默認輸出6位小數,加上2位整數,就是要輸出8位數字),float只能保證7位有效數字,多餘位數上的數字是無效的。
如果以%.1f或%g格式輸出,就不會出這種錯了。
如果改為double類型(相應地,輸入語句要改為%lf格式),這樣可以有15位有效數字,也不會出這種錯的。
F. 什麼是溢出_溢出的原因分析
黑客可通過溢出變數,使這個返回地址指向攻擊代碼,得到你電腦具有管理員資格的控制權。那麼你對溢出解多少呢?以下是由我整理關於什麼是溢出的內容,希望大家喜歡!
什麼是溢出
溢出是黑客利用 操作系統 的漏洞,專門開發了一種程序,加相應的參數運行後,就可以得到你電腦具有管理員資格的控制權,你在你自己電腦上能夠運行的東西他可以全部做到,等於你的電腦就是他的了(別稱肉雞,也叫傀儡機)。
溢出是程序設計者設計時的不足所帶來的錯誤。
溢出的分類緩沖區溢出
緩沖區是用戶為程序運行時在計算機中申請的一段連續的內存,它保存了給定類型的數據。緩沖區溢出指的是一種常見且危害很大的系統攻擊手段,通過向程序的緩沖區寫入超出其長度的內容,造成緩沖區的溢出,從而破壞程序的堆棧,使程序轉而執行其他的指令,以達到攻擊的目的。更為嚴重的是,緩沖區溢出攻擊佔了遠程網路攻擊的絕大多數,這種攻擊可以使得一個匿名的Internet用戶有機會獲得一台主機的部分或全部的控制權!由於這類攻擊使任何人都有可能取得主機的控制權,所以它代表了一類極其嚴重的安全威脅。
緩沖區溢出攻擊的目的在於擾亂具有某些特權運行的程序的功能,這樣可以使得攻擊者取得程序的控制權,如果該程序具有足夠的許可權,那麼整個主機就被控制了。一般而言,攻擊者攻擊root程序,然後執行類似“exec(sh)”的執行代碼來獲得root的shell。為了達到這個目的,攻擊者必須達到如下的兩個目標:在程序的地址空間里安排適當的代碼;通過適當地初始化寄存器和存儲器,讓程序跳轉到事先安排的地址空間執行。根據這兩個目標,可以將緩沖區溢出攻擊分為以下3類。
【緩沖區溢出分類】
控製程序轉移到攻擊代碼
這種 方法 指在改變程序的執行流程,使之跳轉到攻擊代碼。最基本方法的就是溢出一個沒有邊界檢查或者其他弱點的緩沖區,這樣就擾亂了程序的正常的執行順序。通過溢出一個緩沖區,攻擊者可以用近乎暴力的方法改寫相鄰的程序空間而直接跳過了系統的檢查。
1.2.1激活紀錄(Activation Records)
每當一個函數調用發生時,調用者會在堆棧中留下一個激活紀錄,它包含了函數結束時返回的地址。攻擊者通過溢出這些自動變數,使這個返回地址指向攻擊代碼。通過改變程序的返回地址,當函數調用結束時,程序就跳轉到攻擊者設定的地址,而不是原先的地址。這類的緩沖區溢出被稱為“stack smashing attack”,是目.前常用的緩沖區溢出攻擊方式。
1.2.2函數指針(Function Pointers)
C語言中,“void (* foo)()”聲明了一個返回值為void函數指針的變數foo。函數指針可以用來定位任何地址空間,所以攻擊者只需在任何空間內的函數指針附近找到一個能夠溢出的緩沖區,然後溢出這個緩沖區來改變函數指針。在某一時刻,當程序通過函數指針調用函數時,程序的流程就按攻擊者的意圖實現了!它的一個攻擊範例就是在Linux系統下的super probe程序。
1.2.3長跳轉緩沖區(Longjmp buffers)
在C語言中包含了一個簡單的檢驗/恢復系統,稱為setjmp/longjmp。意思是在檢驗點設定“setjmp(buffer)”,用“longjmp(buffer)”來恢復檢驗點。然而,如果攻擊者能夠進入緩沖區的空間,那麼“longjmp(buffer)”實際上是跳轉到攻擊者的代碼。象函數指針一樣,longjmp緩沖區能夠指向任何地方,所以攻擊者所要做的就是找到一個可供溢出的緩沖區。一個典型的例子就是Perl 5.003,攻擊者首先進入用來恢復緩沖區溢出的的longjmp緩沖區,然後誘導進入恢復模式,這樣就使Perl的解釋器跳轉到攻擊代碼上了!
最簡單和常見的緩沖區溢出攻擊類型就是在一個字元串里綜合了代碼殖入和激活紀錄。攻擊者定位一個可供溢出的自動變數,然後向程序傳遞一個很大的字元串,在引發緩沖區溢出改變激活紀錄的同時殖入了代碼。這個是由Levy指出的攻擊的模板。因為C語言在習慣上只為用戶和參數開辟很小的緩沖區,因此這種漏洞攻擊的實例不在少數。
代碼殖入和緩沖區溢出不一定要在一次動作內完成。攻擊者可以在一個緩沖區內放置代碼,這是不能溢出緩沖區。然後,攻擊者通過溢出另外一個緩沖區來轉移程序的指針。這種方法一般用來解決可供溢出的緩沖區不夠大的情況。
如果攻擊者試圖使用已經常駐的代碼而不是從外部殖入代碼,他們通常有必須把代碼作為參數化。舉例來說,在libc中的部分代碼段會執行“exec(something)”,其中something就是參數。攻擊者然後使用緩沖區溢出改變程序的參數,利用另一個緩沖區溢出使程序指針指向libc中的特定的代碼段。
內存溢出
內存溢出已經是軟體開發歷史上存在了近40年的“老大難”問題,象在“紅色代碼”病毒事件中表現的那樣,它已經成為黑客攻擊企業網路的“罪魁禍首”。
如在一個域中輸入的數據超過了它的要求就會引發數據溢出問題,多餘的數據就可以作為指令在計算機上運行。據有關安全小組稱,操作系統中超過50%的安全漏洞都是由內存溢出引起的,其中大多數與微軟的技術有關。
微軟的軟體是針對 台式機 開發的,內存溢出不會帶來嚴重的問題。但現有台式機一般都連上了互聯網,內存溢出就為黑客的入侵提供了便利條件。
數據溢出
在計算機中,當要表示的數據超出計算機所使用的數據的表示範圍時,則產生數據的溢出。
分析溢出原因現實狀況
在幾乎所有計算機語言中,不管是新的語言還是舊的語言,使緩沖區溢出的任何嘗試通常都會被該語言本身自動檢測並阻止(比如通過引發一個異常或根據需要給緩沖區添加更多空間)。但是有兩種語言不是這樣:C 和 C++ 語言。C 和 C++ 語言通常只是讓額外的數據亂寫到其餘內存的任何位置,而這種情況可能被利用從而導致恐怖的結果。更糟糕的是,用 C 和 C++ 編寫正確的代碼來始終如一地處理緩沖區溢出則更為困難;很容易就會意外地導致緩沖區溢出。除了 C 和 C++ 使用得 非常廣泛外,上述這些可能都是不相關的事實;例如,Red Hat Linux 7.1 中 86% 的代碼行都是用 C 或 C ++ 編寫的。因此,大量的代碼對這個問題都是脆弱的,因為實現語言無法保護代碼避免這個問題。
客觀原因
在 C 和 C++ 語言本身中,這個問題是不容易解決的。該問題基於 C 語言的根本設計決定(特別是 C 語言中指針和數組的處理方式)。由於 C++ 是最兼容的 C 語言超集,它也具有相同的問題。存在一些能防止這個問題的 C/C++ 兼容版本,但是它們存在極其嚴重的性能問題。而且一旦改變 C 語言來防止這個問題,它就不再是 C 語言了。許多語言(比如 Java 和 C#)在語法上類似 C,但它們實際上是不同的語言,將現有 C 或 C++ 程序改為使用那些語言是一項艱巨的任務。
普遍因素
G. C語言程序輸出數據溢出問題
在c語言中,數據的存儲就像一個圓圈,正數溢出數據就會從最小負數開始,負數溢出數據同理,打個比方(簡略寫一下):
int
a=32768,b=-32769;
printf("a=%d,b=%d",&a,&b);
則會輸出a=-32768,b=32767;
這樣則50000輸出就是(50000-32767)+(-32768)+(-1)=-15536
H. C語言編程問題,數據溢出。
你的演算法有問題:
你這個程序的演算法段雀沒有你想的這么容易,因為實際上中間你是在做冪運算,而冪運算是非常容易溢出的;
但是考慮到實際上你只是需要輸出後面三位數字即可,那麼按照乘法(冪運算其實是乘法運算)的規則,我們知道其實影響最後三位的是兩個乘數的後三位,高於後三位的是不參與對乘積的後三位的影響的{(1000*x1+y1)*(1000*x1+y1),分析一下就知道了}。
所以,基於以上分析,我們只要將每一次乘積的後三位拿握好早出來進行運算即可。
即你的進行冪運算的這段代碼要改(未調試):
while (i<=n)
{
j*=a;
j=%1000;
i++;
}
如襪猛果還怕出現溢出,先將a也取余數就可以了。
I. c語言中數據溢出的問題怎麼解決
需要准備的材料分別有:電腦、C語言編譯器。
1、首先,打開C語言編譯器,新建一個初始.cpp文件,例如:test.cpp,輸入問題基礎代碼。