从int转换为std :: array <unsigned char,1ul> :: value_type可能会改变其值

Mih*_*dor 8 c++ gcc type-conversion char bitwise-operators

-Wconversion编译此程序时,GCC参数会从标题中生成警告:

#include <iostream>
#include <array>
#include <string>

int main ()
{
    std::string test = "1";
    std::array<unsigned char, 1> byteArray;

    byteArray[0] = byteArray[0] | test[0];

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是我如何编译它:g++- -Wall -Wextra -Wconversion -pedantic -std=c++0x test.cpp我正在使用GCC 4.5.

我在这里做违法的事吗?在某些情况下会引起问题吗?为什么产品会|产生int

Mik*_*our 6

我在这里做违法的事吗?

您正在从签名类型转换为无符号类型.如果有符号值为负,则无符号结果将是一个赋值定义的非负值(因此与初始值不同).

在某些情况下会引起问题吗?

仅当值可能为负时.在某种奇特的架构上可能就是这种情况sizeof (char) == sizeof (int),或者如果你的代码做的事情比将两个值组合起来更复杂|.

为什么产品会|产生int

因为所有整数值在用于算术运算之前都会被提升.如果他们的类型小于int,则将他们提升为int.(促销比这更多,但这是与这个问题相关的规则).