2012-06-22 70 views
0

我是新来C.如何获取c中给定数据类型的最大值?

for.eg说int有32767最大值(但是这个值可能与其他系统不同),我的问题是如何使用C程序来获取任何数据类型的这些值或功能。

int,我试图这种方法,但它返回-1

#include<stdio.h> 
void main(void){ 

unsigned int x=1; 
unsigned long count=0; 

for(x=1;;x++){ 

    if(x==0){break;} 
    count++; 

    } 

printf("%ld",count); 

} 
+0

它'UINT_MAX'和'ULONG_MAX'你在.. – SuperSaiyan

回答

4

limits.h具有恒定UINT_MAX,这是你想要的值。

您看到-1的原因就是%ldunsigned long的错误printf格式。使用%lu。 C不适合泛型编程,但最新的标准C11确实提供了根据参数类型(“类型 - 泛型表达式”)执行不同操作的宏。

我从来没有使用过,但我希望你可以写一个宏NUMERIC_LIMITS_MAX隐藏映射int -> INT_MAXunsigned char -> UCHAR_MAX等产生的代码不会(还)是非常便携的,因为不会有太多的部分实现的C11,更不用说完整的了。

也就是说,对于无符号类型,您始终可以获得最大值为(unsigned long)(-1)等等。签名的类型有点尴尬,因为标准赋予了执行自由来做很多奇怪的事情。实际上,INT_MAX等于(((unsigned int)(-1))/2) + 1。理论上,允许int具有比unsigned int更多的填充比特,在这种情况下INT_MAX更小。

+0

但是如果我在64位系统上,那么这些值可能对于那个系统是错误的,因为这个头文件中的值都是常量。 –

+0

@AshwiniChaudhary:标题中的值对于您正在使用的C实现来说总是正确的。如果你有一个64位的实现,并且我有一个32位的实现,那么你的limits.h的内容与我的不同。同样,如果您使用的是64位系统,但编译/运行32位可执行文件,则与编译64位版本时相比,您会看到一些限制值不同的值。 –

+0

啊!你正确使用'%lu',现在我的程序和UINT_MAX返回相同的值。 –

6
limits.h

定义表示的类型的限制(或边界)数值。在你的情况下,INT_MININT_MAX将是一个便携的方式来找出一个int可以容纳的最小值和最大值。

http://en.wikibooks.org/wiki/C_Programming/C_Reference/limits.h

+0

谢谢,工作正常。 –

+0

但是如果我在64位系统上,那么这些值可能对于那个系统是错误的,因为这个头文件中的值都是常量。 –

3

检查this。一般来说,如果您有关于C或C++的问题,请尝试先在本网站查询,这是一个很好的参考。

+0

+1感谢您的链接。 –

0

解决方案,使INT的最大运行时间:

int main () 
{ 
    unsigned int y = (unsigned int)(~0)>>1; 
    printf ("max of int is %u\r\n",y); 
    return 1; 
} 

交代:

y = ~0设置Y在0二进制相反如果我们的系统是32位,所以0将用(0000 ... 0)(32)二进制表示,其二进制相反表示为(1111 ... 1)(32)。

y>>1用1位移位y,所以y的值将是(0111 ..1)(31),其为int

+0

你能解释一下吗? –

+0

如果我们printf -1为十六进制printf(“%X \ n”, - 1),它将显示0xFFFFFFFF。我不是认为所有的体系结构都代表-1代表0XFFF ...我用另一种适用于所有体系结构的解决方案更新了代码 – MOHAMED

+0

这只适用于无符号整数类型 – CAFxX

0

只是打印-1的最大

#include "stdint.h" 

printf("Byte :%u, Short :%hu, Int :%u, Long Long :%llu\n", 
      (uint8_t)-1, (uint16_t)-1, (uint32_t)-1, (uint64_t)-1); 

的输出是:

字节:255,简称:65535,INT:4294967295,龙隆 :18446744073709551615

我在Linux上...

+0

这将只适用于无符号整数类型 – CAFxX

+0

是的,但对于有符号数据类型,我认为下面应该工作 'printf(“Byte:%u,Short:%hu ,((uint8_t)-1)/ 2,((uint16_t)-1)/ 2,((uint32_t)-1)/ 2,((uint64_t) - 1)/ 2);' – user1473808

相关问题