关于#c++#的问题:下面这段C++代码中,case(type_int16):result=abs(pt.data8[0])+abs(pt.data8[1])+abs(pt.data8[2])

下面这段C++代码中,

case(type_int16):
        result = abs(pt.data8[0]) + abs(pt.data8[1]) + abs(pt.data8[2]);
        break;

这段把第二句改为

result = abs(pt.data16[0]) + abs(pt.data16[1]) + abs(pt.data16[2]);

为啥输出结果就不对了?


#include<iostream>
using namespace std;
enum datatype{type_int8=1,type_int16=2,type_int32=4,type_int64=8};
//直接定义type_int8=1,而不是一般的0
struct Point {//根据type字段的不同取值,可以使用不同的数组来存储数据。
    enum datatype type;
    union {
        std::int8_t data8[3];
        std::int16_t data16[3];
        std::int32_t data32[3];
        std::int64_t data64[3];
    };
};
size_t datawidth(struct Point pt)//定义一个返回数据宽度的函数
{
    return size_t(pt.type) * 3;
}
int64_t l1norm(struct Point pt)
{//定义一个求向量范数的函数
 //范数定义为向量元素绝对值之和
    int64_t result = 0;
    switch (pt.type)
    {
    case(type_int8):
        result = abs(pt.data8[0]) + abs(pt.data8[1]) + abs(pt.data8[2]);
        break;
    case(type_int16):
        result = abs(pt.data8[0]) + abs(pt.data8[1]) + abs(pt.data8[2]);
        break;
    case(type_int32):
        result = abs(pt.data8[0]) + abs(pt.data8[1]) + abs(pt.data8[2]);
        break;
    case(type_int64):
        result = abs(pt.data8[0]) + abs(pt.data8[1]) + abs(pt.data8[2]);
        break;
    }
    return result;
}

int main()
{
    struct Point point1 = { type_int8,{-2,3,4} };
    //".type="这种方式可以提高代码的可读性和可维护性,尤其在结构体中有多个成员时,可以明确指定每个成员的初始值。
    struct Point point2 = { type_int16,{1,-2,3} };

    cout << "Data width = " << datawidth(point1) << endl;
    cout << "Data width = " << datawidth(point2) << endl;

    cout << "L1 norm = " << l1norm(point1) << endl;
    cout << "L1 norm = " << l1norm(point2) << endl;

}

你在case(type_int16)中使用pt.data8数组时,你实际上是把一个16位的整数拆分成了两个8位的整数,然后求它们的绝对值之和
如果你改成使用pt.data16数组,那么你就是直接读取了16位的整数,然后求它们的绝对值之和
结果能一样吗