草庐IT

c++ - 是否可以通过消除 >= 比较的需要,将有符号的双关符号输入无符号整数来加快边界检查?

假设我的程序中有一个对性能非常关键的循环,我需要检查一个点是否在一个矩形内,但我知道在编译时下限总是为0,如下所示:(x>=0&&y>=0&&x我是否可以通过将x和y键入无符号整数来消除前两个比较(例如,在C++中使用reinterpret_cast()或union之类的东西),因为符号位会保证任何负数都会变成足够大的unsignedint边界检查失败?如果是这样,您将如何用C++或其他语言来实现它?这样做可以提高性能吗? 最佳答案 是的,当您测试有符号整数并且下限为零时,这是一个完全有效的优化。事实上,这是一种常见的优化,你的编译

c++代码的安全性与有符号和无符号之间的隐式转换

根据有符号和无符号整数类型之间隐式转换的规则,讨论here和here,当将unsignedint与int相加时,已签名的int首先被转换为unsignedint。考虑,例如,以下最小程序#includeintmain(){unsignedintn=2;intx=-1;std::cout尽管如此,程序的输出还是1,正如预期的那样:x首先转换为unsignedint,然后与n相加>导致整数溢出,给出“正确”答案。在类似上一个的代码中,如果我确定n+x是正数,我可以假设unsignedintn和的和>intx给出期望值? 最佳答案 Ina

c++ - 找到时间 O(n) 和空间 O(1) 的重复有符号整数

(这是对FindingduplicatesinO(n)timeandO(1)space的概括)问题:编写一个时间和空间复杂度分别为O(n)和O(1)的C++或C函数,在不改变给定数组的情况下找到重复整数。示例:给定{1,0,-2,4,4,1,3,1,-2}函数必须打印1、-2和4一次(以任意顺序)。编辑:以下解决方案要求数组的最小值到最大值范围内的每个整数都有一个双位(表示0、1和2)。必要的字节数(无论数组大小)永远不会超过(INT_MAX–INT_MIN)/4+1。#includevoidset_min_max(inta[],longlongunsignedsize,\int*mi

C++ 隐式转换(有符号 + 无符号)

我了解,关于隐式转换,如果我们有一个无符号类型操作数和一个有符号类型操作数,并且无符号操作数的类型与有符号操作数的类型相同(或大于),则有符号操作数将被转换为无符号。所以:unsignedintu=10;signedints=-8;std::cout我不明白-我读到如果有符号操作数的类型大于无符号操作数:如果无符号类型中的所有值都适合较大的类型,则无符号操作数将转换为有符号类型如果无符号类型中的值不适合更大的类型,则有符号操作数将转换为无符号类型所以在下面的代码中:signedlonglongs=-8;unsignedintu=10;std::coutu将被转换为signedlongl

c++ - 循环计数的有符号值与无符号值

所以我在程序中有一个普通的for循环,通过对象vector(我定义的类型的对象,如果相关的话):for(intk=0;k...当我编译时,我收到以下警告:warning:comparisonbetweensignedandunsignedintegerexpressions这是有道理的,因为我认为vector的size()返回一个size_t。但是这有什么关系呢?一定数量的元素(甚至内存块)不是你可以计算的整数吗?更重要的是,由于我的程序有多个这样的循环并且碰巧有很多段错误,这可能是它的一部分吗? 最佳答案 当object.size

c++ - 为什么将有符号值分配给无符号整数时编译器不给出错误? - C++

我知道unsignedint不能保存负值。但以下代码编译时没有任何错误/警告。unsignedinta=-10;当我打印变量a时,我得到了一个错误的值。如果无符号变量不能保存有符号值,为什么编译器允许它们编译而不给出任何错误/警告?有什么想法吗?编辑编译器:VC++编译器解决方案需要使用警告级别4。 最佳答案 微软VisualC++:warningC4245:'initializing':conversionfrom'int'to'unsignedint',signed/unsignedmismatch处于警告级别4。G++给我警告

c++ - 验证 C/C++ 有符号右移是否是特定编译器的算术?

根据C/C++标准(seethislink),C和C++中的>>运算符不一定是有符号数的算术移位。当位向右移动时,是否移入0(逻辑)或符号位(算术)取决于编译器实现。对于为有符号整数实现逻辑右移的编译器,此代码是否会在编译时执行断言(失败)?#defineCOMPILE_TIME_ASSERT(EXP)\typedefintCompileTimeAssertType##__LINE__[(EXP)?1:-1]#defineRIGHT_SHIFT_IS_ARITHMETIC\((((signedint)-1)>>1)==((signedint)-1))//SHRmustbearithme

c++ - 获取没有显式特征的整数模板参数的有符号/无符号变体

我希望定义一个模板类,其模板参数将始终为整数类型。该类将包含两个成员,一个是T类型,另一个是T类型的无符号变体——即如果T==int,然后是T_Unsigned==unsignedint。我的第一直觉是这样做:templateclassRange{typedefunsignedTT_Unsigned;//doesnotcompilepublic:Range(Tmin,T_Unsignedrange);private:Tm_min;T_Unsignedm_range;};但它不起作用。然后我考虑使用部分模板特化,如下所示:templatestructUnsignedType{};//de

c++ - 如果我们添加安全的有符号/无符号比较 C/C++,它会破坏语言或现有代码吗?

在阅读了这个关于有符号/无符号比较的问题后(​​我会说他们每隔几天出现一次):Signed/unsignedcomparisonand-Wall我想知道为什么我们没有正确的有符号无符号比较,而是这个可怕的困惑?从这个小程序中获取输出:#include#defineC(T1,T2)\{signedT1a=-1;\unsignedT2b=1;\printf("(signed%5s)%d使用我的标准编译器(gcc,64位)编译,我得到了这个:char:1(signedchar)-1如果我编译为32位,结果是一样的,除了:long:4(signedlong)-1“如何?”所有这些都很容易找到:

c++ - 为什么 C++ 不接受字符数组的有符号或无符号字符

我在VisualStudio2017中以native模式使用C++。该编译器编译下面的语句没有任何提示:constchar*AnArrayOfStrings[]={"z1y2x3w4","Aname"};但是,如果我更改上述语句以指定char是有符号还是无符号,编译器会发出C2440错误。例如,下面的语句,不编译:constsignedchar*AnArrayOfStrings2[]={"z1y2x3w4","Aname"};constunsignedchar*AnArrayOfStrings2[]={"z1y2x3w4","Aname"};当char的符号显式时,我看不到编译器拒绝编