C++ 将int(或long,或任何形式)截断为特定大小(n字节),有符号和无符号

C++ 将int(或long,或任何形式)截断为特定大小(n字节),有符号和无符号,c++,C++,假设我有两个变量: size_t value; size_t size; 我想把值转换成大小。因此,如果size为4,则将value转换为4字节长。如果大小为3,值可能会被截断为3字节长,保留符号(假设有符号的int可以加载到值中,然后取出后再转换回有符号),并根据符号选择存储在int/uint中。最好使用一种方法,该方法可以将无符号long或任何其他整数类型转换为任意大小(以字节为单位)以及有符号/无符号。这取决于截断的含义。如果您的目的只是将截断点以外的字节清除为零,那么您可能会得到如下结

假设我有两个变量:

size_t value;
size_t size;

我想把
转换成
大小
。因此,如果
size
为4,则将
value
转换为4字节长。如果
大小
为3,
可能会被截断为3字节长,保留符号(假设有符号的int可以加载到
中,然后取出后再转换回有符号),并根据符号选择存储在int/uint中。最好使用一种方法,该方法可以将无符号long或任何其他整数类型转换为任意大小(以字节为单位)以及有符号/无符号。

这取决于截断的含义。如果您的目的只是将截断点以外的字节清除为零,那么您可能会得到如下结果:

size_t mask[] = {0x00000000, 0xff000000, 0xffff0000, 0xffffff00, 0xffffffff};
value &= mask[size];
因此,如果
size
为零,则不保留任何内容。如果大小为2,则只保留上面的两个字节


显然,这将取决于数据类型的实际宽度,因此是特定于实现的。但无论如何,情况就是这样,因为您在
size\u t
和其他数据类型之间进行转换-这些类型不一定兼容。

转换为
long
是为了保留符号,long应该至少与size\u t一样大(尽管我认为在MS编译器中并非如此)。如果不正确,请选择一个与size_t一样大的不同签名类型,并替换对long的三个引用

size_t casted = size_t(long(value) << (8 * (sizeof(long) - size))) >> (8 * (sizeof(long) - size)));
size\u t casted=size\u t(长(值)>(8*(长)尺寸);
对于未签名版本,请使用size\u t而不是long


这是未经测试的。

我对此不是很确定,但这应该可以:(typeid(size).name())值将某个内容“截断”为“3字节”意味着什么???例如,在2的补码表示法中,任何4字节有符号值都可以立即被解释为3字节值(假设它符合目标范围)。表示中不需要更改任何内容。那么,“截断”到底是什么意思?您的平台是否具有3字节整数类型?如果没有,那么我看不出它可能意味着什么。MS在这里是它的权利范围。C99中:“用于size_t和ptrdiff_t的类型的整数转换秩不应大于有符号long int的整数转换秩,除非实现支持足够大的对象以使其成为必要。”