正在缩小C++中的转换
Narrowing conversion in C++
在Beej的网络编程指南中,有一个函数旨在提供一种可移植的方式来序列化16位整数。
/*
** packi16() -- store a 16-bit int into a char buffer (like htons())
*/
void packi16(unsigned char *buf, unsigned int i)
{
*buf++ = i>>8; *buf++ = i;
}
我不明白为什么语句*buf++ = i;
是可移植的,因为将无符号整数(i
)赋值给无符号字符(*buf
)会导致转换变窄。
- C++标准是否保证在这样的转换中,
unsigned int
总是被截断,并且其最低有效位8保留在unsigned char
中 如果没有,有没有更可取的方法来解决这个问题?将功能体更改为以下内容是否足够?
*buf++=(i>>8)&0xFFFFU*buf++=i&0xFFFFU;
代码采用8位字节,这是不可移植的。
例如,一些德州仪器的数字信号处理器具有16位字节。
每个字节的比特数由CCD_ 6从CCD_ 7给出。
此外,该代码假定unsigned
是16位,这是不可移植的。
总之,该代码是不可移植的。
Re
"C++标准是否保证在这样的转换中,无符号int总是被截断,并且它的最低有效位8保留在无符号char中?
不,因为C++标准不能保证每个字节的位数是8。
唯一的保证是至少为8位。
然而,无符号算术保证是模块化的。
Re
”如果没有,有没有更可取的方法来解决这个问题?
使用一个简单的循环,迭代sizeof(unsigned)
次。
有问题的代码似乎是从这样的循环中提取出来的,因为*buf++ = i;
中的后增量完全没有意义(这是buf
的最后一次使用)。
是的,对无符号类型的超范围赋值会将值调整为模1,大于该类型中可表示的最大值。在这种情况下,修改UCHAR_MAX+1
。
无需修复。有些人喜欢写*buf++ = i % 0x100;
或等效内容,以表明这是有意缩小范围。
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 是否可以从int转换为enum类类型
- 了解 GLM- openGL 中的相机转换
- 将无符号char*转换为std::istream*C++