是unsigned char('0')合法的C ++

时间:2010-07-08 23:02:46

标签: c++

以下在Visual Studio中编译,但无法在g ++下编译。

int main()
{
    int a = unsigned char('0');
    return 0;
}

unsigned char()是一种在C ++中强制转换的有效方法吗?

8 个答案:

答案 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,则需要一个确定该值的实际函数。