如何在C中找出整数边界

时间:2012-05-16 06:59:24

标签: c

我正在开发一个程序,我需要知道C中有符号整数的确切边界。我的问题是,如果你编译一个依赖于这个边界的程序,你是否必须检查本地环境以了解如何许多位用于保存值?

我会尝试更好地解释这一点。每当我编写一个使用有符号整数的C程序,并且该程序的一部分依赖于大数字时,我担心一个简单的计算溢出:比如4,294,967,296 + 1.会发生什么?这个号码会翻到负数吗?

它取决于我如何编译程序(换句话说,我用来编译程序的编译器)还是依赖于运行我的.exe的环境?

感谢您的帮助!

5 个答案:

答案 0 :(得分:3)

((sizeof(n)+ sizeof(int) - 1)&〜(sizeof(int) - 1))

这应该给你极限

答案 1 :(得分:2)

它仅取决于您编译程序的方式,即您不需要在运行时检查“环境”。对于任何重要的事情,您应该使用<stdint.h>中的固定大小整数类型,例如int32_t

您可以使用<limits.h>中的常量检查整数类型的范围,例如INT_MAX

答案 2 :(得分:2)

标题#include <limits.h>包含您需要的常量,包括:

  • CHAR_BIT - char
  • 中的位数
  • CHAR_MAX - 普通char的最大值。
  • SCHAR_MAX - signed char的最大值。
  • UCHAR_MAX - unsigned char的最大值。
  • SHRT_MAX - short的最大值。
  • USHRT_MAX - unsigned short的最大值。
  • INT_MAX
  • UINT_MAX
  • LONG_MAX
  • ULONG_MAX
  • LLONG_MAX
  • ULLONG_MAX

对于签名类型,还有最小值:

  • CHAR_MIN - 简单char;值可能为0或负数。
  • SCHAR_MIN
  • SHRT_MIN
  • INT_MIN
  • LONG_MIN
  • LLONG_MIN

完全定义了无符号算术对溢出的行为(生成的值是正确的模UINT_MAX + 1或类似的,具体取决于操作数的类型。)

对溢出的带符号算术的行为是未定义的,并且比调查好得多。任何给定的编译器都可以按照它选择的方式处理它。传统上,溢出的值经常被包装(添加两个大的正但有符号的整数通常产生负值)。但是,现代C编译器不太宽容。

如果您真的担心它,可以使用上面的整数常量来帮助防止溢出。

答案 3 :(得分:1)

使用limits.h标题。它定义了不同类型的最大值和最小值的常量。

答案 4 :(得分:1)

  

说4,294,967,296 + 1.会发生什么?这个数字会翻到负数吗?

如果添加了该号码,如果未签名,则会翻转为0。如果将1加到最高正数,则unsigned int将翻转为最低负数。