C 做",<&引用;及&燃气轮机&引用;当大小溢出时,运算符是否正常工作?
我正在做一个更新20年前代码的项目,其中很多问题都与整数溢出有关。我想确保正确地测试溢出,所以我编写了一个测试程序。它的输出使我感到惊讶。这是:C 做",<&引用;及&燃气轮机&引用;当大小溢出时,运算符是否正常工作?,c,printf,overflow,operator-keyword,size-t,C,Printf,Overflow,Operator Keyword,Size T,我正在做一个更新20年前代码的项目,其中很多问题都与整数溢出有关。我想确保正确地测试溢出,所以我编写了一个测试程序。它的输出使我感到惊讶。这是: #include <stdlib.h> #include <stdio.h> #include <string.h> #include <limits.h> int main (void) { size_t largerNum,Num; largerNum = 12; Num =
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <limits.h>
int main (void) {
size_t largerNum,Num;
largerNum = 12;
Num = UINT_MAX;
printf("largerNum = %u\nNum = %u\nNum + 1 = %u\n", largerNum , Num, Num + 1);
largerNum = Num + 1;
printf("largerNum now = %u\n", largerNum);
if(largerNum < Num ){
printf("largerNum overflowed to %u\n", largerNum);
}
else {
printf("largerNum did not overflow: %u\n", largerNum);
}
printf("Is (0 < UINT_MAX)?\n");
(0 < UINT_MAX)?printf("YES\n"):printf("NO\n");
printf("Is (largerNum < Num)?\n");
(largerNum < Num)?printf("YES\n"):printf("NO\n");
return 0;
}
输出:
[afischer@susm603 /home/afischer/Fischer_Playground/overflowTest]$ main
largerNum = 12
Num = 4294967295
Num + 1 = 0
largerNum now = 1
largerNum overflowed to 1
Is (0 < UINT_MAX)?
YES
Is (largerNum < Num)?
YES
largerNum = 1
Num = 4294967295
[afischer@susm603 /home/afischer/Fischer_Playground/overflowTest]$ main
largerNum = 12
Num = 4294967295
Num + 1 = 0
largerNum now = 1
largerNum overflowed to 1
Is (0 < ULONG_MAX)?
YES
Is (largerNum < Num)?
YES
largerNum = 1
Num = 4294967295
最终输出:
[afischer@susm603 /home/afischer/Fischer_Playground/overflowTest]$ main
largerNum = 12
Num = 18446744073709551615
Num + 1 = 0
largerNum now = 1
largerNum overflowed to 1
Is (0 < ULONG_MAX)?
YES
Is (largerNum < Num)?
YES
largerNum = 1
Num = 18446744073709551615
[afischer@susm603/home/afischer/Fischer_游乐场/溢流测试]$main
largerNum=12
Num=18446744073709551615
Num+1=0
largerNum now=1
largerNum溢出到1
是(0
我猜您的平台有一个64位的大小
,并且您使用了错误的格式说明符来打印大小
,这导致了误导性的输出
在gcc和clang上使用%zu
,在MSVC上使用%Iu
。或者忘记所有这些,使用std::cout
打印结果
在VS2015上使用%Iu
,我在64位编译器上得到的输出是
largerNum = 12
Num = 4294967295
Num + 1 = 4294967296
largerNum now = 4294967296
largerNum did not overflow: 4294967296
Is (0 < UINT_MAX)?
YES
Is (largerNum < Num)?
NO
largerNum=12
Num=4294967295
Num+1=4294967296
largerNum现在=4294967296
largerNum没有溢出:4294967296
是(0
只需在@Praetorian的答案中添加并显示类型安全实现:
#include <iostream>
#include <limits>
int main (void) {
using std::size_t;
using std::cout;
size_t largerNum = 12;
size_t Num = std::numeric_limits<size_t>::max();
cout << "largerNum = " << largerNum << "\nNum = " << Num << "\nNum + 1 = " << Num + 1 << "\n";
largerNum = Num + 1;
cout << "largerNum now = " << largerNum << "\n";
if(largerNum < Num ){
cout << "largerNum overflowed to " << largerNum << "\n";
}
else {
cout << "largerNum did not overflow: " << largerNum << "\n";
}
cout << "Is (0 < Unsigned Maximum)?\n";
(0 < std::numeric_limits<size_t>::max())?cout << "YES\n":cout << "NO\n";
cout << "Is (largerNum < Num)?\n";
(largerNum < Num)?cout << "YES\n":cout << "NO\n";
return 0;
}
#包括
#包括
内部主(空){
使用std::size\u t;
使用std::cout;
大小\u t largerNum=12;
size_t Num=std::numeric_limits::max();
哪个部分让你感到惊奇?相关:在<代码>(0 UINTIMAX)你的编译器认为<代码> 0 <代码>是代码> int <代码>吗?如果是的话,<代码>(0<0xFFFFFFFF)是false。我认为< C++ >代码> SigZyt在您的平台上是64位,但是您使用的是错误的代码> Prtff< /Cult>格式说明符,因此截断了。因为这也是标记C++,所以使用<代码> CUT<代码>打印,您的问题可能会消失。暗示显示size\u t
的方法不正确。我现在要去查找%zu
。我更困惑的是,为什么将size\u t
更改为无符号长
会使我的代码正常工作。有什么原因使无符号长
与size\u t
的处理方式不同吗?我不争辩这一点区别对待,我想只是想找一堂历史课或解释printf的内部工作。@makenbaconunsigned long
可能与size\u t
的范围不同。相同的大小并不意味着相同的范围-尽管这很少见。忽略我所有的无知。我已经用那些讨厌的%zu
更新了最终的代码ntries和huzzah!一切都很有意义。谢谢您的时间。=)@Makenbaccon尝试打印无符号整数
、无符号长
和大小的大小(记住使用%zu
打印大小的结果
)前两个可能是4个字节,最后8个。谢谢,这将影响我在C++中的代码。我最初标记了这个C++,但这是个错误。我必须看一下Booo::格式。再次感谢你们的帮助!
6 int main (void) {
7
8 unsigned long largerNum,Num;
9
10 largerNum = 12;
11 Num = ULONG_MAX;
12
13 printf("largerNum = %zu\nNum = %zu\nNum + 1 = %zu\n", larger Num, Num, Num + 1);
14
15 largerNum = Num + 2;
16
17 printf("largerNum now = %zu\n", largerNum);
18
19 if(largerNum < Num ){
20 printf("largerNum overflowed to %zu\n", largerNum);
21 }
22 else {
23 printf("largerNum did not overflow: %zu\n", largerNum);
24 }
25
26 printf("Is (0 < ULONG_MAX)?\n");
27
28 (0 < ULONG_MAX)?printf("YES\n"):printf("NO\n");
29
30 printf("Is (largerNum < Num)?\n");
31
32 (largerNum < Num)?printf("YES\n"):printf("NO\n");
33
34
35 printf("largerNum = %zu\n", largerNum);
36 printf("Num = %zu\n", Num);
37
38 return 0;
39 }
[afischer@susm603 /home/afischer/Fischer_Playground/overflowTest]$ main
largerNum = 12
Num = 18446744073709551615
Num + 1 = 0
largerNum now = 1
largerNum overflowed to 1
Is (0 < ULONG_MAX)?
YES
Is (largerNum < Num)?
YES
largerNum = 1
Num = 18446744073709551615
largerNum = 12
Num = 4294967295
Num + 1 = 4294967296
largerNum now = 4294967296
largerNum did not overflow: 4294967296
Is (0 < UINT_MAX)?
YES
Is (largerNum < Num)?
NO
#include <iostream>
#include <limits>
int main (void) {
using std::size_t;
using std::cout;
size_t largerNum = 12;
size_t Num = std::numeric_limits<size_t>::max();
cout << "largerNum = " << largerNum << "\nNum = " << Num << "\nNum + 1 = " << Num + 1 << "\n";
largerNum = Num + 1;
cout << "largerNum now = " << largerNum << "\n";
if(largerNum < Num ){
cout << "largerNum overflowed to " << largerNum << "\n";
}
else {
cout << "largerNum did not overflow: " << largerNum << "\n";
}
cout << "Is (0 < Unsigned Maximum)?\n";
(0 < std::numeric_limits<size_t>::max())?cout << "YES\n":cout << "NO\n";
cout << "Is (largerNum < Num)?\n";
(largerNum < Num)?cout << "YES\n":cout << "NO\n";
return 0;
}