1. 程式人生 > >深入理解計算機系統 練習題2.25 答案與分析

深入理解計算機系統 練習題2.25 答案與分析

#include <stdio.h>  
#include "stdafx.h"
#include <iostream>


using namespace std;

float sum_elements(float a[], unsigned length) {
    int i;
    float result = 0;
    cout << length << endl;
    cout << length - 1 << endl;
    for (i = 0; i <= length - 1;i++) {
        result += a[i];
    }

    return
result; } int main() { float a[] = {1.1,2,2.3,3.4}; cout << sum_elements(a, 0) << endl; }

返回結果 這裡寫圖片描述 可以發現length - 1=4294967295,原因是length的型別是unsigned 但是1的型別是是int,所以計算轉為無符號數計算,length - 1=length +(- 1),現在的問題是-1的無符號數是多少-1的十六進位制無符號數為0xFFFFFFFF換算之後是4294967295,所以程式碼就出現了異常,for迴圈進去之後陣列下標越界。 修改為

#include <stdio.h>  
#include "stdafx.h"
#include <iostream>


using namespace std;

float sum_elements(float a[], int length) {
    int i;
    float result = 0;
    cout << length << endl;
    cout << length - 1 << endl;
    for (i = 0; i <= length - 1;i++) {
        result += a[i];
    }

    return
result; } int main() { /*float a[] = {1.1,2,2.3,3.4}; cout << sum_elements(a, 0) << endl;*/ unsigned int a = 50; unsigned int b = 100; printf("%u", a - b); }