![](/img/trans.png)
[英]warning: conversion to 'unsigned char' from 'int' may alter its value
[英]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.