C語言有無符號資料運算錯誤
C語言有符號與無符號運算易出現的錯誤
一、例子
例如:c語言中在帶符號資料的運算過程中,若同時存在有符號和無符號變數,則會隱式的將有符號數轉換為無符號數進行運算。其中典型的程式
#include <stdio.h> float sum(float a[], unsigned length) { int i; float result = 0; for (i = 0; i <= length - 1; i++) { result += a[i]; } return result; } int main() { float a[] = { 1.0,2.0 }; float result; result = sum(a, 0); printf("%f\n", result); return 0; }
上面這個程式能編譯通過,但在執行時會直接崩潰。
二、錯誤原因
呼叫sum函式時傳入引數
result = sum(a, 0); //陣列長度為零
在sum函式的for語句中
for (i = 0; i <= length - 1; i++)
length-1轉為無符號則為一個特別大的正整數(隨程式碼執行環境改變),則不斷執行
運算,導致陣列越界而程式崩潰
三、如何修改sum函式
慎用無符號數。
個人理解:只需將形參改為有符號數即可
float sum(float a[], int length) { int i; float result = 0; for (i = 0; i <= length - 1; i++) { result += a[i]; } return result; }
相關推薦
C語言有無符號資料運算錯誤
C語言有符號與無符號運算易出現的錯誤 一、例子 例如:c語言中在帶符號資料的運算過程中,若同時存在有符號和無符號變數,則會隱式的將有符號數轉換為無符號數進行運算。其中典型的程式 #in
C語言中無符號數和有符號數相加比較的問題
轉自https://blog.csdn.net/supreme42/article/details/6687781 看個題: #include<stdio.h> int main() { unsigned int a=6; int b=-20; printf("%d\n"
程式語言有無符號移位小見
本篇文章主要是自己對左右移位所學的心得,花了兩個多小時,終於弄明白了,不敢私藏,故拿出來和大家分享,希望大家能更清楚地瞭解計算機語言移位操作。 進入正題前先了解幾個概念: 1. 正負數符號位(最高位),正數為0,負數為1 2. 補碼:正數的補碼為其本身,負數的補碼是其絕對
警惕邏輯表示式中的無符號型別運算(C語言型別轉換)
今天在處理邏輯表示式時遇到了類似以下程式的問題。if( strlen(tmp)-10 <0)這個條件怎麼都進不去。經過VS除錯可發現printf("%d",b-10<0);列印的結果為0。 #include<stdio.h> #include<
C語言有符號與符號引數的比較
1.整型無符號引數與有符號引數比較 程式碼段: #include<cstdio> int main() { int a=-1; unsigned int b=0; if(b>a)printf("b>a\n"); else printf("b<a\
C++有/無符號數字型別之間的比較
在kmp.cpp中的迴圈,迴圈判斷下標(int型別)與std::string::size_type型別比較發生了迴圈只執行一部分的問題。 int i = j = 0 while (i < s.size() && j < p.size()) { /
C語言有符號數截斷補位問題
在程式設計師面試寶典中看到這樣一道題,下面程式的輸出結果是什麼? 1 #include <stdio.h> 2 3 int main(int argc, char const *argv[]) 4 { 5
OO_W2:C#資料型別和C語言有什麼不同?
OO_W2_Question:(9月15日—9月21日) C#資料型別和C語言有什麼不同?OO_W2_Answer: 討論中……ps: 請大家注意,9月21日後的回覆將不作計分。
原碼、反碼、補碼、有符號數和無符號數運算
原碼 原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其餘位表示值. 比如如果是8位二進位制: [+1]原 = 0000 0001 [-1]原 = 1000 0001 第一位是符號位. 因為第一位是符號位, 所以8位二進位制數的取值範圍就是:
C的無符號資料型別int,short,byte 轉為 Java對應的資料long,char,short
//從網路中讀取C的無符號int,short,byte位元組陣列,相應轉換成java的long,char,short short anUnsignedByte = 0; char anUnsignedShort = 0; long anUnsigned
C語言有參函式呼叫時引數間資料傳遞問題
指標變數作實參在呼叫時仍然符合前述“值傳遞”規則,將其“值”賦給形參,相當於複製。此時資料在實參與形參間傳遞仍是單向的,呼叫函式不會影響實參的“值”(即指標變數中所存地址)。而與簡單變數不同的是指標變數複製給形參的“值”本身是一個地址,這個地址為形參訪問其所指變數創造了可靠條件。我的理解是,實參是一個抽屜的鑰
c語言有頭循環單鏈表
。。 creat != 姓名 single 創建 ++ clas 進行 /************************************************************************* > File Name: sing
C語言創建符號常量的三種方法;printf()和scanf()函數
c1、#indefine pi 3.1415926形式的宏定義2、const int MONTHS=12;這使得MONTHS成為一個只讀值。3、enum 枚舉類型4、printf()和scanf()函數使我們能夠與程序通信,他們被稱為輸入/輸出函數,(I/O函數)5、字符串、浮點數輸出的類型及介紹:實例程序:
C語言程序編寫中犯的錯誤的記錄(一)
C 程序編寫 錯誤 今天學習用到了《C程序設計(第四版)》的求兩個數的最大值的程序devcpp程序:#include <stdio.h>int main(){int max(int x,int y);int a,b,c;scanf("%d,%d",&a,&a
java中的無符號移位運算
color 位運算 沒有 區分 進制 ger 存在 pri 符號 1. 無符號右移 >>> 或 >>> = 無符號右移(>>>)跟右移(>>)運算符不一樣。 右移不改變數的正負。 對於一個正數,無符號右
C語言禍根之看不見的錯誤,那些年學指針從入門到如土都是內存問題
ont spa 有關 沒有 解析 分發 bbu 入門到 錯誤管理 是那樣的愛學習那一刻從入門到入土醜拒前言C 語言程序中的內存錯誤非常有害:它們很常見,並且可能導致嚴重的後果,最難受的極大多數時候內存問題看不見,也摸不著。編譯正確運行出錯,讓新手從入門到入土,讓老手也頭痛不
C#語言中數據的運算
double int 運算 數字運算 double類型 數據 數字 語言 字符 1、數字運算:數字與數字的運算 支持運算:加(+)、減(-)、乘(*)、除(/)、求余(%) 返回運算:與運算類型相同 (1)int類型的數據與int類型的數據運算,返回運算是int類型; (2
C語言學習筆記之位運算求余
nbsp 位運算 sdn 縮小 .net 一次 得出 ngs 有效 我們都知道,求一個數被另一個數整除的余數,可以用求余運算符”%“,但是,如果不允許使用求余運算符,又該怎麽辦呢?下面介紹一種方法,是通過位運算來求余,但是註意:該方法只對除數是2的N次方冪
C語言學習筆記-1.(資料表示和輸出)
C裡面的資料表示和輸出很重要.所以在此記下一些平時會用的東西. 1.系統自帶輸出八進位制和十六進位制(整數): 輸出八進位制:%o 輸出帶字首的八進位制:%#o 輸出十六進位制:%x
【C語言】指標的算術運算(指標+/-整數、指標+/-指標)
一、指標+/-整數 在之前學習指標時,我們知道指標其實也是一種特殊的變數,既然這樣,那麼指標應該和普通變數一樣,可以進行算術運算。那問題就來了,是不是對指標的任何運算都是合法的呢? 答案是它可以執行某些運算,但並非所有的運算都合法。(指標可以進行加減法,對於乘除法是非法的)