繁体   English   中英

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

[英]Conversion to std::array<unsigned char, 1ul>::value_type from int may alter its value

编译此程序时, -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;
}

以下是我编译它的方法: g++- -Wall -Wextra -Wconversion -pedantic -std=c++0x test.cpp我正在使用GCC 4.5。

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

我在这里做违法的事吗?

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

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

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

为什么会产生| 产生一个int

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

是的,一个字符串由char签名,你有一个unsigned char数组。

至于| 生成一个int,它叫做整数提升。 基本上编译器使它们都是int,做一个|,然后再次使它们成为char。

但它遇到了一个问题。 根据C / C ++标准,如果提升的类型可以包含从中提升的所有类型的值,则会发生整数提升。 所以它将unsigned char提升为unsigned int,将signed char提升为signed int。 促销签名价值标志 - 扩展它。 所以说你有-1或0xFF或11111111.那就是扩展到10000000000000000000000001111111 signed int((int)-1)。 显然,与11111111((char)-1)具有不同的结果会直观地预期。

有关详细信息,请参阅此处: 此处介绍了一种“解决方法”

unsigned char | char结果 unsigned char | char是每个整数转换规则的 int 当你将int赋值给unsigned char ,赋值可以截断它的int值 - 编译器不知道你在这个int有多大的值。

要使编译器静音:

byteArray[0] = static_cast<unsigned char>(byteArray[0] | test[0]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM