以下在Visual Studio中编译,但无法在g ++下编译。
int main()
{
int a = unsigned char('0');
return 0;
}
unsigned char()是一种在C ++中强制转换的有效方法吗?
答案 0 :(得分:11)
不,这不合法。
函数式显式类型转换需要简单类型说明符,后跟带括号的表达式列表。 (§5.2.3)unsigned char
不 简单类型说明符;这与James提出的问题有关。
显然,如果unsigned char
是简单类型说明符,那么它将是合法的。解决方法是使用std::identity
:
template <typename T>
struct identity
{
typedef T type;
};
然后:
int a = std::identity<unsigned char>::type('0');
std::identity<unsigned char>::type
是简单类型说明符,其类型只是模板参数的类型。
当然,你会得到static_cast
的二合一。无论如何,这是首选的铸造方法。
答案 1 :(得分:5)
使用C ++进行强制转换的首选方法是使用static_cast
,如下所示:
int a = static_cast<unsigned char>( '0' );
答案 2 :(得分:3)
尝试添加方括号int a = (unsigned char)('0');
或
typedef unsigned char uchar;
//inside main
int a = uchar('0');
答案 3 :(得分:2)
不,它不是 - 函数式强制转换不能在其名称中包含空格。
C风格演员的案例:
int main() {
unsigned char c = (unsigned char) '0' ;
}
答案 4 :(得分:1)
我很确定它是微软的扩展。
答案 5 :(得分:0)
不,不是。但为什么演员阵容居首位?这完全有效,
int a = '0';
答案 6 :(得分:0)
为什么你甚至试图从char转换为unsigned char并将其分配给int?你将一个无符号值放入一个有符号的int(这是合法的,但是非冷却)。
写'0'会给你一个值为48的字符。你可以尝试
int i = (int) '0';
这样,您获取char,将其转换为int,然后使用它。你甚至可以说
int i = '0';
这也会做同样的事情。你究竟想做什么?
答案 7 :(得分:0)
你想把整数0或字符'0'加入吗?大多数实现中的字符“0”即为整数48,但为8位。
char和int之间的唯一区别是char必须小于或等于short int。因此,int必须大于或等于short int,这通常会使char 8位,16位短,现在32位。
像'a'+2
这样的Stuf让'c'
正常工作。如果你有一个足够长的数组,你也可以像array[' ']
一样索引它以获得索引32。
如果您尝试将其强制转换为整数值0,则需要一个确定该值的实际函数。