C++ (7-12)模24等于19,但在C+中+;它等于4294967291

C++ (7-12)模24等于19,但在C+中+;它等于4294967291,c++,math,C++,Math,如果我用谷歌搜索(7-12)mod 24,我会得到答案19 当我做C++时,我得到4294967291个/p> uint32_t hour = (7 - 12) % 24; // hour = 4294967291 如果我尝试int32\t int32_t hour = (7 - 12) % 24; // hour = -5 7-12 ans无符号整数(uint32)产生下溢 另见 对于编程语言7-12 ans中负数运算符的定义,无符号整数(uint32)给出下溢 另见 对于编程语言中负数运

如果我用谷歌搜索
(7-12)mod 24
,我会得到答案
19

<>当我做C++时,我得到4294967291个/p>
uint32_t hour = (7 - 12) % 24;
// hour = 4294967291
如果我尝试int32\t

int32_t hour = (7 - 12) % 24;
// hour = -5
7-12 ans无符号整数(uint32)产生下溢

另见 对于编程语言7-12 ans中负数运算符的定义,无符号整数(uint32)给出下溢

另见
对于编程语言中负数运算符的定义,uint32\u t

是无符号的,这意味着它仅限于正数。这也意味着它的范围更大,因为有符号字节的值可以从-127到127,而无符号字节的值可以从0到255。当无符号整数下溢时,它将返回一个大数字

int32\u t
返回-5而不是19的原因是因为

埃里克·利珀特(Eric Lippert)也对这一点做出了惊人的总结。具体地说

%运算符没有给出标准模,它给出了余数。 "


同时,谷歌给出了规范自模< > 123模4=1 < /代码>,而不是< > > 3 >代码>,如在C++或C语言中。

< P> <代码> UTIT32×t 是无符号的,这意味着它被限制为正数。这也意味着它的范围更大,因为有符号字节的值可以从-127到127,而无符号字节的值可以从0到255。当无符号整数下溢时,它将返回一个大数字

int32\u t
返回-5而不是19的原因是因为

埃里克·利珀特(Eric Lippert)也对这一点做出了惊人的总结。具体地说

%运算符没有给出标准模,它给出了余数。 "

同时,谷歌给出了规范代码,因为代码< > 123 mod 4=1 < /代码>,而不是< > > 3 >代码>,如C++或C语言中的那样。<> p> <代码>(7 -12)%24 < <代码>是一个已签名的表达式,并将其赋值给<代码>未签名int < /代码>使您看到不同的结果

在C中,
%
是余数运算,因此
(7-12)%24=-5

unsigned(-5) = 4294967291 // since 4294967291 + 5 = 4294967296
当Google和Python使用数学模运算时,结果是19。19+5=24

(7-12)%24
是一个有符号表达式,将其赋给
无符号int
会使您看到不同的结果

在C中,
%
是余数运算,因此
(7-12)%24=-5

unsigned(-5) = 4294967291 // since 4294967291 + 5 = 4294967296
当Google和Python使用数学模运算时,结果是19。19+5=24


模运算实际上有几种不同的可能定义,产生负数的各种结果。C++的定义给出了表达式
(7-12)%24
的负结果(-5),当您将负值转换为无符号值时,会得到奇怪的结果。该值与执行以下操作时得到的值相同:

uint32_t x = 0;
x = x - 5;

模运算实际上有几种不同的可能定义,产生负数的各种结果。C++的定义给出了表达式
(7-12)%24
的负结果(-5),当您将负值转换为无符号值时,会得到奇怪的结果。该值与执行以下操作时得到的值相同:

uint32_t x = 0;
x = x - 5;


有道理。为什么int32_t结果与Google不匹配?@BlindsSamuel结果不是未定义的。它是明确定义的:如果您试图在
无符号int
中存储一个超出范围的值,它将被调整为模
UINT_MAX+1
,直到它符合要求为止。为什么int32_t结果与Google不匹配?@BlindsSamuel结果不是未定义的。它是明确定义的:如果您试图在
无符号int
中存储一个超出范围的值,它将被调整为模
UINT_MAX+1
,直到在转换时它适合为止,您可以添加或减去
UMAX+1
,以获得一个有效的无符号值。例如,将<代码> -1 转换为un签署将始终给你那个类型的最大未签名值。在C++中,<代码> /<代码>对零进行截断,因此<代码> -5/24=0 代码>%
定义为
(a/b)*b+a%b==a
,因此它必须是
-5
。不要混合使用有符号值和无符号值。转换时添加或减去
UMAX+1
,以获得有效的无符号值。例如,将<代码> -1 转换为un签署将始终给你那个类型的最大未签名值。在C++中,<代码> /<代码>对零进行截断,因此<代码> -5/24=0 code>%的定义是
(a/b)*b+a%b==a
,因此它必须是
-5
。不要混合使用有符号值和无符号值。@RobertHarvey谢谢,但我看不出这是如何解决问题的。@RobertHarvey检查编辑。。。我只是不想把这整件未签名/签名的事情搞得一败涂地,但实际的接线员仍然需要解决。到目前为止,还没有人对这个问题给出一个像样的答案。我在回答中简单地说,负数不能填充到无符号整数中而不产生任何后果,但显然这还不够具体。正确的答案是使用正确的数据类型。@RobertHarvey所问的问题并不令人惊讶clear@RobertHarvey谢谢,但我不知道这是怎么解决这个问题的。@RobertHarvey检查编辑。。。我只是不想把这整件未签名/签名的事情搞得一败涂地,但实际的接线员仍然需要解决。到目前为止,还没有人对这个问题给出一个像样的答案。我在回答中简单地说,负数不能填充到无符号整数中而不产生任何后果,但显然这还不够具体。正确的答案是使用正确的数据类型。@RobertHarvey被问的问题并没有令人惊讶地清晰回答
4294967291+5=4294967296
没有真正解释为什么,您可以查看我对问题I的回答以获得解释。Sa