C 做",<&引用;及&燃气轮机&引用;当大小溢出时,运算符是否正常工作?

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 =

我正在做一个更新20年前代码的项目,其中很多问题都与整数溢出有关。我想确保正确地测试溢出,所以我编写了一个测试程序。它的输出使我感到惊讶。这是:

#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的内部工作。@makenbacon
unsigned 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;
}