Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+中的无符号移位模板+; 我想在C++中做一个无符号的转换。下面是我的示例代码。问题是它不是通用的。这个代码是完全错误的。它不适用于long,也不适用于char等较小的类型。我尝试了(未签名的T),但这是一个语法错误。如果没有专门化,我如何使它成为通用的 #include <cassert> template<class T> T unsigned_shift(const T&t, int s) { return ((unsigned int)t)>>s; } int main() { assert(unsigned_shift(-1, 2)==(-1u>>2)); assert(unsigned_shift((char)-1, 2)==64); } #包括 模板 T unsigned_shift(const T&T,int s){return((unsigned int)T)>>s;} int main() { 断言(无符号移位(-1,2)==(-1u>>2)); 断言(无符号移位((字符)-1,2)==64); }_C++_Templates - Fatal编程技术网

C+中的无符号移位模板+; 我想在C++中做一个无符号的转换。下面是我的示例代码。问题是它不是通用的。这个代码是完全错误的。它不适用于long,也不适用于char等较小的类型。我尝试了(未签名的T),但这是一个语法错误。如果没有专门化,我如何使它成为通用的 #include <cassert> template<class T> T unsigned_shift(const T&t, int s) { return ((unsigned int)t)>>s; } int main() { assert(unsigned_shift(-1, 2)==(-1u>>2)); assert(unsigned_shift((char)-1, 2)==64); } #包括 模板 T unsigned_shift(const T&T,int s){return((unsigned int)T)>>s;} int main() { 断言(无符号移位(-1,2)==(-1u>>2)); 断言(无符号移位((字符)-1,2)==64); }

C+中的无符号移位模板+; 我想在C++中做一个无符号的转换。下面是我的示例代码。问题是它不是通用的。这个代码是完全错误的。它不适用于long,也不适用于char等较小的类型。我尝试了(未签名的T),但这是一个语法错误。如果没有专门化,我如何使它成为通用的 #include <cassert> template<class T> T unsigned_shift(const T&t, int s) { return ((unsigned int)t)>>s; } int main() { assert(unsigned_shift(-1, 2)==(-1u>>2)); assert(unsigned_shift((char)-1, 2)==64); } #包括 模板 T unsigned_shift(const T&T,int s){return((unsigned int)T)>>s;} int main() { 断言(无符号移位(-1,2)==(-1u>>2)); 断言(无符号移位((字符)-1,2)==64); },c++,templates,C++,Templates,转换到unsigned long执行移位,然后再转换回T返回移位,怎么样 同样,在一个正常的两位数补码中,第二次移位的结果不是63而是64吗?如果您可以使用,库中的模板将完全适合您的需要 #include <boost/type_traits/make_unsigned.hpp> template<class T> T unsigned_shift(const T&t, unsigned int s) { return ((make_unsigned&l

转换到
unsigned long
执行移位,然后再转换回
T
返回移位,怎么样

同样,在一个正常的两位数补码中,第二次移位的结果不是63而是64吗?

如果您可以使用,库中的模板将完全适合您的需要

#include <boost/type_traits/make_unsigned.hpp>

template<class T>
T unsigned_shift(const T&t, unsigned int s)
{
    return ((make_unsigned<T>::type)t)>>s;
}
#包括
模板
T无符号移位(常量T&T,无符号整数s)
{
返回((make_unsigned::type)t)>>s;
}

(我将
s
的类型更改为
unsigned int
,因为移位运算符的操作对于第二个操作数的负值是未定义的-请参见§5.8¨1)

哦,对了,应该是63。但是,将-1强制转换为无符号long将设置所有位,因此>>1仍将为-1。设置了所有1的无符号long不是负数。这是该类型的最大可能值。我不确定是否可以使用boost,但我查看了代码,似乎必须使用专门化。我稍后会接受,因为我希望C++0x用户可以添加另一个答案(如果存在另一个答案)@acidzombie24
std::make_[un]signed
将与C++0x一起提供,在
内部。它们的规格与增压特性相似。最后,请记住,返回时从unsigned到T的最终(隐式)转换是在T有符号时定义的实现。