我正在开发一个程序,我需要知道C中有符号整数的确切边界。我的问题是,如果你编译一个依赖于这个边界的程序,你是否必须检查本地环境以了解如何许多位用于保存值?
我会尝试更好地解释这一点。每当我编写一个使用有符号整数的C程序,并且该程序的一部分依赖于大数字时,我担心一个简单的计算溢出:比如4,294,967,296 + 1.会发生什么?这个号码会翻到负数吗?
它取决于我如何编译程序(换句话说,我用来编译程序的编译器)还是依赖于运行我的.exe的环境?
感谢您的帮助!
答案 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将翻转为最低负数。