C++ 如何在C++;

C++ 如何在C++;,c++,literals,unsigned,C++,Literals,Unsigned,在我的程序中,我经常使用-1(又名UINT_MAX)作为无符号变量的值来表示一些特殊的东西。我也比较了这个值。打开更高级别的警告消息表明编译器(VS和GCC)不喜欢这种语法 // warning C4245: 'initializing' : conversion from 'int' to 'unsigned int', signed/unsigned mismatch unsigned a = -1; // warning C4146: unary minus operator appli

在我的程序中,我经常使用-1(又名UINT_MAX)作为无符号变量的值来表示一些特殊的东西。我也比较了这个值。打开更高级别的警告消息表明编译器(VS和GCC)不喜欢这种语法

// warning C4245: 'initializing' : conversion from 'int' to 'unsigned int', signed/unsigned mismatch
unsigned a = -1;

// warning C4146: unary minus operator applied to unsigned type, result still unsigned
unsigned b = -1U;

// fine but messy
unsigned c = unsigned(-1);

// no warning on VS, signed/unsigned comparison warning with GCC
if (a == -1)
{
  std::cout << "check\n";
}
//警告C4245:“正在初始化”:从“int”转换为“unsigned int”,有符号/无符号不匹配
无符号a=-1;
//警告C4146:一元减号运算符应用于无符号类型,结果仍然无符号
无符号b=-1U;
//很好但是很乱
无符号c=无符号(-1);
//VS无警告,GCC有符号/无符号比较警告
如果(a==-1)
{

std::cout使用ULONG_MAX怎么样? 你需要包括限制


或者,您也可以使用0xFFFFFF——当然是在宏或静态常量中正确定义的。

我认为您不应该混淆无符号和有符号。-1是有符号的,并且应该保持这种方式,可能这是一个设计问题,您希望经常使用-1。有类似boost::optional的解决方案

例如:

#include <boost/optional.hpp>
#include <iostream>

boost::optional<int> find (const std::string& s, char t)
{
   for (int i = 0 ; i < s.length () ; ++ i)
   if (s [i] == t)
   return i ;
   return boost::optional<int>() ;
}

int main (int argc, char* argv[]) 
{
    std::string s = argv[1] ;
    char t = *argv[2] ;
    boost::optional<int> idx = find (s, t) ;
    if (idx)
        std::cout << "found at " << *idx << std::endl ;
    else
        std::cout << "not found" << std::endl ;

   return 0 ;
}
#包括
#包括
boost::可选查找(const std::string&s,chart)
{
对于(int i=0;istd::cout为了避免处理int的长度,可以使用

~0

这给了你所有的,在一个两个补机器上(还有其他的吗?)和1一样。但是它是合法的无符号long。< /p> < P> <强>。根据它的本质,你不能把否定的写为C++中的无符号文字或任何其他语言。< /强> < /P> 你不是说

-1
,你是说

答复1:

<>是的,它们都是正确的,尽管是令人不快的C++结构。

    >代码> -> 1代码被解释为int文字。它是正确的C++语法,因为标准允许隐式int到unStand int转换,但是编译器警告这个隐式转换在更高的警告级别时使用。 > -1U/<代码>被集成为代码> >(1U)< /代码>。采用未签名int的否定是正确的C++语法,因为编译器执行模<代码>(UTINGMax + 1)< /C> >,但是编译器发出警告,让您知道。
  • (unsigned(-1)==-1)
    也是正确的语法,因为编译器隐式地将
    -1
    转换为
    unsigned(-1)
    ,以进行比较。它会以更高的警告级别警告您隐式转换,让您知道它已经这样做了
答复2:

有几个选项可以将
无符号(-1)
作为文字写入或生效:

  • 写入
    无符号(-1)
  • ~0U
    ,在双人比赛机上,取
    0
    ,然后对每一位求反,得到最大的可表示无符号数
  • 写入
    UINT\u MAX
    ,有效地将
    定义为
    无符号(-1)
  • 如果赋值或与无符号值进行比较,请编写
    -1
    ,让编译器进行隐式转换并处理警告消息。但是,应该注意的是-1是一个int文本,仅根据其在代码中的函数转换为无符号
  • 编写
    std::numeric\u limits::max()
    ,这是一个返回
    无符号(-1)
    的函数。请注意,在C++11中,此函数将是一个constepr,好的编译器应始终将其简化为文本。VC++目前将其简化为
    无符号(-1)
    用于非调试版本。但是,它是从函数调用返回的值,而不是文本

查看本文末尾的讨论主题

结果是,(unsigned)-1是完全合法的,并且保证具有该类型的最大值,而不管实际宽度或内部表示

这是否是一个好主意是另一个问题。就个人而言,我更喜欢约翰西韦伯提供的解决方案


至于你是否总是需要演员,这将是编译器依赖的。既然你已经尝试过VS和GCC,似乎是这样的。

你反对使用代码> uTimax Max < /Cord>?因为这是C++,最好使用<代码> STD::MultIcILimix::Max()/Cux> UntIxMax是一个定义(ULUGULMAX不相关)。0xFFFFFFFFFFL是一个长字符,不是无符号的,并且是特定于系统的。包括Boost以将-1写入无符号文本不是一个选项。在无符号变量上-1有很多用法,例如,请参见std::string中的许多用法。@devtk for std::string您应该编写
std::string::npos
。但是有legitimate使用。例如,wcswidth()返回一个size\u t,但通过返回-1来报告错误。因此,将返回值与
(size\u t)-1
size\u t(-1)进行比较
是正确的方法。您可能希望在某个地方声明机器是两个的补码。替代方法并不常见,但它并不需要任何努力,而且可移植性很好,即使只是一个练习。我的VS编译器说~0是一个int,因此警告是相同的。您所说的
这是一个合法的unsign是什么意思ed long
?嗯,-1是编译时常量,而std::numeric\u limits::max()据我所知,不是。因为我在比较大循环时使用了它,所以我希望提高效率。我很欣赏这些注释,但调用constexpr函数仍然不是一个字面意义。我在第一句中明确了-1作为UINT_MAX的意思。这个标题是为了让搜索引擎能够正确地标记它。搜索没有告诉我们什么搜索引擎很难处理“-1”这样的数字。下一个维护这段代码的人如何知道你的意思是“-1”还是“最大的未签名数字”
#include <iostream>
#include <limits>

int main()
{
    unsigned a = std::numeric_limits<unsigned int>::max();

    if (a == std::numeric_limits<unsigned int>::max())
    {
        std::cout << "check " << a << "\n";
    }
}
const unsigned int magic_number = std::numeric_limits<unsigned int>::max();

    // [...]
    if (a == magic_number)