Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C4244:'+=';:从';std::streamsize';至';尺寸';,数据可能丢失_C++_Visual C++_Visual Studio 2013 - Fatal编程技术网

C++ C4244:'+=';:从';std::streamsize';至';尺寸';,数据可能丢失

C++ C4244:'+=';:从';std::streamsize';至';尺寸';,数据可能丢失,c++,visual-c++,visual-studio-2013,C++,Visual C++,Visual Studio 2013,我已将我的VC++项目从VS2008迁移到VS2013,并收到一些警告,如: C4244:“+=”:从“std::streamsize”转换为“size\t”,可能会丢失数据。 如何解决这些类型的警告?如中所述,std::streamsize被定义为签名的(重点): 类型std::streamsize是一种有符号整数类型,用于表示在I/O操作中传输的字符数或I/O缓冲区的大小。它用作std::size\u t的签名副本,类似于POSIX类型ssize\u t 无论如何,似乎没有具体说明具体的实现

我已将我的VC++项目从VS2008迁移到VS2013,并收到一些警告,如:

C4244:“+=”:从“std::streamsize”转换为“size\t”,可能会丢失数据。

如何解决这些类型的警告?

如中所述,
std::streamsize
被定义为
签名的
(重点):

类型
std::streamsize
是一种有符号整数类型,用于表示在I/O操作中传输的字符数或I/O缓冲区的大小。它用作
std::size\u t
的签名副本,类似于POSIX类型
ssize\u t

无论如何,似乎没有具体说明具体的实现

通常,从
有符号
无符号
类型(例如
long
)的转换不应发出有关可能数据丢失的警告(除非使用符号指示器)


这可能是Visual StudioC++中的一个很差的实现。

< P>在MSVC 2013中,代码> STD::StRealStase:

typedef _Longlong streamsize;
typedef _LONGLONG _Longlong;
#define _LONGLONG   __int64
typedef unsigned __int64    size_t;
size\u t
是:

typedef _Longlong streamsize;
typedef _LONGLONG _Longlong;
#define _LONGLONG   __int64
typedef unsigned __int64    size_t;
因此,一个简单的重新编程案例是:

unsigned __int64 b = 1;
__int64 a = b;
但是,这不会发出警告-所以您可能将
大小\u t
重新定义为32位

为清楚起见:

std::streamsize b = 1;
size_t a = 0;
b = a;

也不会发出警告。

这取决于使用情况。根据,

除了在std::streambuf的构造函数中,std::streamsize的负值从未使用过

因此,您可以安全地强制转换签名值

std::streamsize i;
// ...
尺寸=静态铸件(i);
然而,在更一般的情况下(与πάντα相反ῥεῖ 我认为这个警告是有效的(即使
gcc
没有给出类似的警告)。比较有符号值和无符号值时,最好明确您的意思

您可以强制无符号,例如,使用以下代码段(感谢的常规形式):


#包括
模板
typename std::enable_如果::type
强制未签名(TU){
if(u<0){
throw std::overflow_error(“不能将负值用作无符号类型”);
}
返回static_cast(u);
}
模板
typename标准::如果<,则启用!std::is_signed::value,T>::type
强制未签名(TU){
返回u;
}
int main(){

St::CUT可能不重复@ RKMYHODORIGKING。关于代码>未签名int=(int)-1;< />代码>什么?您希望代码> U>代码>吗?您会考虑这个数据丢失吗?编译器应该发出警告吗?