下面这段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位的整数,然后求它们的绝对值之和
结果能一样吗