Questions tagged «signed»

在计算中,签名是表示计算机程序中数字的数据类型的属性。


17
在std :: vector上进行迭代:无符号vs有符号索引变量
在C ++中迭代向量的正确方法是什么? 考虑下面的两个代码片段,这一段效果很好: for (unsigned i=0; i < polygon.size(); i++) { sum += polygon[i]; } 还有这个: for (int i=0; i < polygon.size(); i++) { sum += polygon[i]; } 产生warning: comparison between signed and unsigned integer expressions。 我是C ++领域的新手,所以unsigned变量对我来说有点令人恐惧,我知道unsigned如果使用不正确,变量可能很危险,所以-这正​​确吗?
469 c++  stl  unsigned  signed 

15
有符号整数与无符号整数
我是否正确地说带符号整数和无符号整数之间的区别是: 无符号的可以具有较大的正值,而不能为负值。 Unsigned使用前导位作为值的一部分,而signed版本使用最左边的位来标识数字是正数还是负数。 有符号整数可以同时包含正数和负数。 还有其他区别吗?

6
为什么0 <-0x80000000?
我下面有一个简单的程序: #include &lt;stdio.h&gt; #define INT32_MIN (-0x80000000) int main(void) { long long bal = 0; if(bal &lt; INT32_MIN ) { printf("Failed!!!"); } else { printf("Success!!!"); } return 0; } 条件if(bal &lt; INT32_MIN )始终为真。这怎么可能? 如果我将宏更改为: #define INT32_MIN (-2147483648L) 谁能指出这个问题?


11
〜x +〜y ==〜(x + y)始终为假?
此代码是否总是评估为false?这两个变量都是二进制补码整数。 ~x + ~y == ~(x + y) 我觉得应该有一些数字可以满足条件。我尝试测试之间的数字-5000,5000但从未实现平等。有没有办法建立方程式来找到条件的解? 将一个交换为另一个会在我的程序中引起隐患吗?

8
C ++将十六进制字符串转换为有符号整数
我想在C ++中将十六进制字符串转换为32位带符号整数。 因此,例如,我有一个十六进制字符串“ fffefffe”。其二进制表示为11111111111111101111111111111110。其带符号整数表示为:-65538。 如何在C ++中进行此转换?这也需要适用于非负数。例如,十六进制字符串“ 0000000A”(二进制为00000000000000000000000000001010),十进制为10。
135 c++  integer  hex  signed 


2
为什么C ++ 20中引入了std :: ssize()?
C ++ 20引入了以下std::ssize()免费功能: template &lt;class C&gt; constexpr auto ssize(const C&amp; c) -&gt; std::common_type_t&lt;std::ptrdiff_t, std::make_signed_t&lt;decltype(c.size())&gt;&gt;; 似乎可以使用实现static_cast,将size()cl ass C的成员函数的返回值转换为其有符号的对等。 由于size()C 的成员函数始终返回非负值,所以为什么有人要将它们存储在带符号的变量中?万一真的要,那很简单static_cast。 为什么std::ssize()在C ++ 20中引入?
99 c++  stl  unsigned  signed  c++20 

5
有符号/无符号比较
我试图理解为什么以下代码没有在指定的位置发出警告。 //from limits.h #define UINT_MAX 0xffffffff /* maximum unsigned int value */ #define INT_MAX 2147483647 /* maximum (signed) int value */ /* = 0x7fffffff */ int a = INT_MAX; //_int64 a = INT_MAX; // makes all warnings go away unsigned int b = UINT_MAX; bool c = false; if(a &lt; …

12
在C / C ++中检测签名溢出
乍一看,这个问题似乎与“如何检测整数溢出”重复出现。,但实际上有很大的不同。 我发现,虽然检测无符号整数溢出非常简单,但是在C / C ++中检测带符号溢出实际上比大多数人想象的要困难。 最明显但最幼稚的方式是: int add(int lhs, int rhs) { int sum = lhs + rhs; if ((lhs &gt;= 0 &amp;&amp; sum &lt; rhs) || (lhs &lt; 0 &amp;&amp; sum &gt; rhs)) { /* an overflow has occurred */ abort(); } return sum; } 这样做的问题是根据C标准,有符号整数溢出是未定义的行为。 换句话说,根据标准,甚至在导致签名溢出时,程序就如同取消引用空指针一样无效。因此,您不能导致未定义的行为,然后尝试在事后检测溢出,如上述后置条件检查示例中所示。 即使上面的检查可能在许多编译器上都有效,但您不能指望它。实际上,由于C标准说未定义有符号整数溢出,因此某些编译器(如GCC)会在设置优化标志时优化上述检查,因为编译器认为有符号溢出是不可能的。这完全中断了检查溢出的尝试。 因此,另一种检查溢出的可能方法是: …


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.