深入理解计算机系统 练习题2.25 答案与分析

#include   
#include "stdafx.h"
#include 


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;

}

返回结果
深入理解计算机系统 练习题2.25 答案与分析_第1张图片
可以发现length - 1=4294967295,原因是length的类型是unsigned 但是1的类型是是int,所以计算转为无符号数计算,length - 1=length +(- 1),现在的问题是-1的无符号数是多少-1的十六进制无符号数为0xFFFFFFFF换算之后是4294967295,所以代码就出现了异常,for循环进去之后数组下标越界。
修改为

#include   
#include "stdafx.h"
#include 


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);

}

你可能感兴趣的:(深入理解计算机系统)