草庐IT

c++ - 有符号整数溢出在 C++ 中仍然是未定义的行为吗?

据我们所知,signedintegeroverflowisundefinedbehavior.但是在C++11cstdint文档中有一些有趣的东西:signedintegertypewithwidthofexactly8,16,32and64bitsrespectivelywithnopaddingbitsandusing2'scomplementfornegativevalues(providedonlyiftheimplementationdirectlysupportsthetype)Seelink这是我的问题:因为标准明确规定对于int8_t、int16_t、int32_t和i

c++ - 在 C/C++ 中检测有符号溢出

乍一看,这个问题可能与Howtodetectintegeroverflow?重复,但实际上有很大不同。我发现虽然检测无符号整数溢出非常简单,但在C/C++中检测有符号溢出实际上比大多数人想象的要困难。最明显但最幼稚的方法是:intadd(intlhs,intrhs){intsum=lhs+rhs;if((lhs>=0&&sumrhs)){/*anoverflowhasoccurred*/abort();}returnsum;}问题在于,根据C标准,有符号整数溢出是未定义的行为。换句话说,根据标准,一旦你甚至导致有符号溢出,你的程序就像您取消引用空指针一样无效。所以不能导致未定义的行为,

c++ - 有符号/无符号比较

我试图理解为什么下面的代码没有在指定位置发出警告。//fromlimits.h#defineUINT_MAX0xffffffff/*maximumunsignedintvalue*/#defineINT_MAX2147483647/*maximum(signed)intvalue*//*=0x7fffffff*/inta=INT_MAX;//_int64a=INT_MAX;//makesallwarningsgoawayunsignedintb=UINT_MAX;boolc=false;if(ab)//warningC4018:'=b)//warningC4018:'我还以为是后台推广

C++将十六进制字符串转换为有符号整数

我想在C++中将十六进制字符串转换为32位有符号整数。因此,例如,我有十六进制字符串“ffffeffe”。它的二进制表示是11111111111111101111111111111110。它的有符号整数表示是:-65538。如何在C++中进行这种转换?这也需要对非负数起作用。比如十六进制字符串“0000000A”,二进制是00000000000000000000000000001010,十进制是10。 最佳答案 使用std::stringstreamunsignedintx;std::stringstreamss;ss>x;以下示例

c++ - 为什么定义了无符号整数溢出行为但没有定义有符号整数溢出?

无符号整数溢出在C和C++标准中都有很好的定义。例如,C99standard(§6.2.5/9)状态Acomputationinvolvingunsignedoperandscanneveroverflow,becausearesultthatcannotberepresentedbytheresultingunsignedintegertypeisreducedmodulothenumberthatisonegreaterthanthelargestvaluethatcanberepresentedbytheresultingtype.但是,两个标准都规定有符号整数溢出是未定义的行为。

c++ - 有符号和无符号之间的减法,然后是除法

下面的结果让我很困惑:inti1=20-80u;//-60inti2=20-80;//-60inti3=(20-80u)/2;//2147483618inti4=(20-80)/2;//-30inti5=i1/2;//-30i3似乎被计算为(20u-80u)/2,而不是(20-80u)/2据说i3和i5是一样的。 最佳答案 IIRC,有符号和无符号整数之间的算术运算将产生无符号结果。因此,20-80u产生等价于-60的无符号结果:如果unsignedint是32位类型,则该结果是4294967236。顺便说一句,将其分配给i1会产生

c++ - 有符号和无符号之间的减法,然后是除法

下面的结果让我很困惑:inti1=20-80u;//-60inti2=20-80;//-60inti3=(20-80u)/2;//2147483618inti4=(20-80)/2;//-30inti5=i1/2;//-30i3似乎被计算为(20u-80u)/2,而不是(20-80u)/2据说i3和i5是一样的。 最佳答案 IIRC,有符号和无符号整数之间的算术运算将产生无符号结果。因此,20-80u产生等价于-60的无符号结果:如果unsignedint是32位类型,则该结果是4294967236。顺便说一句,将其分配给i1会产生

ruby - 如何在 Ruby 中将有符号整数转换为无符号整数?

我有一个从C程序收到的负数数字:-1771632774应该是这个数字:2523334522我意识到这一定是由于从有符号整数到无符号整数的某种转换。现在我在Ruby中有了这个负数,我怎样才能将它转换回无符号版本? 最佳答案 将负整数放入数组中。使用'L'参数调用pack,该参数表示“32位无符号native字节序(uint32_t)”。使用相同的参数调用unpack。最后,从数组中取出数字。[-1771632774].pack('L').unpack('L').first#=>2523334522http://ruby-doc.org

c++ - 将有符号整数位复制到无符号整数的有效方法

/*[1]*/inti=-1;unsignedu=(unsigned)i;/*[2]*/inti=-1;unsignedu;memcpy(&u,&i,sizeofi);/*[3]*/inti=-1;unsignedu=*(unsigned*)&i;为了将有符号整数位复制到其无符号伙伴,[1]应该可以在大多数机器上工作,但据我所知,这并不能保证行为。[2]应该完全符合我的要求,但我想避免调用库函数的开销。那么[3]呢?它是否有效地实现了我的意图? 最佳答案 /*[4]*/unionunsigned_integer{inti;unsig

c++ - 将有符号整数位复制到无符号整数的有效方法

/*[1]*/inti=-1;unsignedu=(unsigned)i;/*[2]*/inti=-1;unsignedu;memcpy(&u,&i,sizeofi);/*[3]*/inti=-1;unsignedu=*(unsigned*)&i;为了将有符号整数位复制到其无符号伙伴,[1]应该可以在大多数机器上工作,但据我所知,这并不能保证行为。[2]应该完全符合我的要求,但我想避免调用库函数的开销。那么[3]呢?它是否有效地实现了我的意图? 最佳答案 /*[4]*/unionunsigned_integer{inti;unsig