繁体   English   中英

具有负操作数的C ++ size_t模运算

[英]C++ size_t modulus operation with negative operand

因此,模运算可以为您提供三个值:

然后:

-7%5 = 3(数学,余数> = 0)

-7%5 = -2(C ++)

-7%(size_t)5 = 4(C ++)

另一个例子:

-7%4 = 1(数学,余数> = 0)

-7%4 = -3(C ++)

-7%(size_t)4 = 1(C ++)

当左操作数为正时,这三种方法之间的答案都是相同的。 但是对于负值,它们似乎都有自己的方法。 在C ++中如何计算无符号操作数上的模运算值?

当您混合带符号和无符号的值时,会发生这种情况-混乱!

[C++14: 5.6/2]: */的操作数应为算术或无作用域枚举类型; %的操作数应具有整数或无作用域的枚举类型。 通常对操作数执行算术转换,并确定结果的类型。

现在,请参见下面的粗体部分(假定您的size_t与您的int具有相同的等级;这始终是正确的):

[C++14: 5/10]:许多期望算术或枚举类型的操作数的二进制运算符都以类似的方式导致转换并产生结果类型。 目的是产生一个通用类型,它也是结果的类型。 这种模式称为通常的算术转换 ,其定义如下:

  • 如果两个操作数都属于范围枚举类型(7.2),则不执行任何转换。 如果另一个操作数不具有相同的类型,则表达式格式错误。
  • 如果一个操作数的类型为long double,则另一个应转换为long double。
  • 否则,如果其中一个操作数为double,则另一个应转换为double。
  • 否则,如果其中一个操作数为float,则另一个应转换为float。
  • 否则,应在两个操作数上执行整数提升(4.5)。61然后,以下规则应应用于提升的操作数:
    • 如果两个操作数具有相同的类型,则无需进一步转换。
    • 否则,如果两个操作数都具有符号整数类型或都具有无符号整数类型,则整数转换等级较小的操作数应转换为等级较大的操作数的类型。
    • 否则, 如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,则带符号整数类型的操作数应转换为无符号整数类型的操作数的类型。
    • 否则,如果带符号整数类型的操作数的类型可以表示无符号整数类型的操作数的所有值,则应将无符号整数类型的操作数转换为带符号整数类型的操作数的类型。
    • 否则,两个操作数均应转换为与带符号整数类型的操作数类型相对应的无符号整数类型。

简而言之,您的-7变为std::numeric_limit<size_t>::max() + 1 - 7 (无论平台上是什么),并且正在对该值执行计算。 确实, 我的平台上,这证实了1的结果

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM