1. 程式人生 > >C語言有無符號資料運算錯誤

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語言】指標的算術運算(指標+/-整數、指標+/-指標)

一、指標+/-整數  在之前學習指標時,我們知道指標其實也是一種特殊的變數,既然這樣,那麼指標應該和普通變數一樣,可以進行算術運算。那問題就來了,是不是對指標的任何運算都是合法的呢? 答案是它可以執行某些運算,但並非所有的運算都合法。(指標可以進行加減法,對於乘除法是非法的)