首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 如何求int型数据的最大值? [已结贴,结贴人:lejingxin]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lejingxin
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2008-03-26 22:07:08 楼主
    我用下面的程序算出了INT型数据的最大值为2147483647,但是运算速度太慢了有没有更好的算法,谢谢?

    #include <stdio.h>
    #include <string.h>
    void main()
    {
        int a=1,bj=1;
        while(bj)
    {
    a++;
    if(a <0)
    bj=0;
    }
    printf("%d\n",a-1);
    }
    10  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sheenl
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-26 22:09:541楼 得分:0
    cout < <numeric_limits <int>::max() < <endl;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sheenl
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-26 22:11:092楼 得分:4
    c语言就是
    #include <limits.h>

    printf("%d\n", INT_MAX);
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lejingxin
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-26 22:46:503楼 得分:0
    谢谢!
    其他类型的数据最大值是不是也是这样的求的呢?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • rover___
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-26 22:51:334楼 得分:1
    还可以用sizeof(type)来求。知道类型的存储字节数,就很明白了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • arong1234
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-26 22:58:235楼 得分:2
    最大值就是符号位为0,其他位都为1的整数,哪要那么复杂,不就是
    int(((unsigned int)(~0))>>1)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bm1408
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-26 23:27:066楼 得分:0
    int(((unsigned int)(~0))>>1)

    我看了半天,看来我需要补充一下知识了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • arong1234
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-26 23:52:287楼 得分:0
    ~0把所有位变为1,转换乘无符号数,确保右移是逻辑右移(还是其他名字?:)),也就是高位会因为右移空出个0,这样就作出一个最高位(符号位)为0其他位都为1的整数了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • guangling_san
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-27 00:28:018楼 得分:0
    /*
        不知道楼主用的什么编译器?书上说int型的是-32768~32767的取值范围。楼主所说的数值是long int型的取值范围吧?我用win-tc编译器,LZ的程序值为32767。
        后我自己作了个程序,int型取值一样,不过改为long型后,却得值为-1。这是为什么呢?希望各位帮忙解答一下,不胜感激。
    */
    C/C++ code
    #include <stdio.h> int main(void) { int a; for(a=30000;a>0;a++); printf("%d\n",a-1); getch(); }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • visame
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-27 00:49:259楼 得分:1
    C/C++ code
    看看C标准就啥都明白了。 5.2.4.2 Numerical limits 1 An implementation is required to document all the limits specified in this subclause, which are specified in the headers <limits.h> and <float.h>. Additional limits are specified in <stdint.h>. Forward references: integer types <stdint.h> (7.18). 5.2.4.2.1 Sizes of integer types <limits.h> 1 The values given below shall be replaced by constant expressions suitable for use in #if preprocessing directives. Moreover, except for CHAR_BIT and MB_LEN_MAX, the following shall be replaced by expressions that have the same type as would an expression that is an object of the corresponding type converted according to the integer promotions. Their implementation-defined values shall be equal or greater in magnitude (absolute value) to those shown, with the same sign. — number of bits for smallest object that is not a bit-field (byte) CHAR_BIT 8 — minimum value for an object of type signed char SCHAR_MIN -127 // -(27 - 1)//应该是2的7次方减1(不是27减一),下同 — maximum value for an object of type signed char SCHAR_MAX +127 // 27 - 1 — maximum value for an object of type unsigned char UCHAR_MAX 255 // 28 - 1 — minimum value for an object of type char CHAR_MIN see below — maximum value for an object of type char CHAR_MAX see below — maximum number of bytes in a multibyte character, for any supported locale MB_LEN_MAX 1 — minimum value for an object of type short int SHRT_MIN -32767 // -(215 - 1) — maximum value for an object of type short int SHRT_MAX +32767 // 215 - 1 — maximum value for an object of type unsigned short int USHRT_MAX 65535 // 216 - 1 — minimum value for an object of type int INT_MIN -32767 // -(215 - 1) — maximum value for an object of type int INT_MAX +32767 // 215 - 1 — maximum value for an object of type unsigned int UINT_MAX 65535 // 216 - 1 — minimum value for an object of type long int LONG_MIN -2147483647 // -(231 - 1) — maximum value for an object of type long int LONG_MAX +2147483647 // 231 - 1 — maximum value for an object of type unsigned long int ULONG_MAX 4294967295 // 232 - 1 — minimum value for an object of type long long int LLONG_MIN -9223372036854775807 // -(263 - 1) — maximum value for an object of type long long int LLONG_MAX +9223372036854775807 // 263 - 1 — maximum value for an object of type unsigned long long int ULLONG_MAX 18446744073709551615 // 264 - 1 下面是C++,C++中有一个专门的类叫做numeric_limits。 18.2.1.2 numeric_limits members [lib.numeric.limits.members] static T min() throw(); 1 Minimum finite value.181) 2 For floating types with denormalization, returns the minimum positive normalized value. 3 Meaningful for all specializations in which is_bounded != false, or is_bounded == false && is_signed == false. static T max() throw(); 4 Maximum finite value.182) 5 Meaningful for all specializations in which is_bounded != false.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • houdongfeng
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-27 09:04:4910楼 得分:2
    #include  <limits.h>

    printf("%d\n", INT_MAX);

    int(((unsigned int)(~0))>>1)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wbczyh
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-27 09:17:4011楼 得分:0
    int(((unsigned int)(~0))>>1)这个方法好,呵呵
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wbczyh
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-27 09:20:5912楼 得分:0
    ~ 0000 0000 0000 0000      = 1111 1111 1111 1111
      1111 1111 1111 1111 >> 1 = 0111 1111 1111 1111 = +32767
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wbczyh
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-27 09:22:2013楼 得分:0
    假如int是16位的话就是上面的结果,32位类似。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ttkk_2007
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-27 09:25:2914楼 得分:0
    int x = 0x7fffffff;
    printf("%d\n", x);
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lejingxin
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-27 16:45:0615楼 得分:0
    我用的是vc++6.0是32位的!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ttkk_2007
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-27 16:47:5016楼 得分:0
    32位的又如何
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • matrixdwy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-28 15:31:1417楼 得分:0
    我带上一个求int型最小取值的代码

    C/C++ code
    #include<iostream.h> void main() { min=(unsigned int)(~1)>>1; min=~min; cout<<min<<endl; /* 关于如何求得int的最小值: 同样假设有符号int型在系统中占用8位二进制码。 本来,如果把0(有符号)取反,0 000 0000->1 111 1111,就可以直接求出int的最小取值了。但是有趣的是,事实并非如此: ~0的结果是-1 ~1的结果是-2 ~2的结果是-3 ~3的结果是-4 为什么会是这样?那我们把以上参与的数字统统变成二进制码来看一下。 ~(0 000 0000) -> 1 111 1111 (应该是十进制的-127) 而事实上是1 000 0001 ~(0 000 0001) -> 1 111 1110 (应该是十进制的-126) 而事实上是1 000 0010 ~(0 000 0010) -> 1 111 1101 (应该是十进制的-125) 而事实上是1 000 0011 ~(0 000 0011) -> 1 111 1100 (应该是十进制的-124) 而事实上是1 000 0100 因此我怀疑在对有符号整型进行取反操作的时候,系统实际上是把除符号位意外的位统统保留原样,再最低位补1,即: ~0 000 0000 -> 1 000 0000 ->(最低位补1) 1 000 0001 ~0 000 0001 -> 1 000 0001 ->(最低位补1) 1 000 0010 ~0 000 0010 -> 1 000 0010 ->(最低位补1) 1 000 0011 ~0 000 0011 -> 1 000 0011 ->(最低位补1) 1 000 0100 所以在求有符号int型的最小取值的时候,我们应该先定义一个无符号1(0000 0001),对1进行取反(1111 1110),再将其右移动一位 0111 1111(高位补0,低位抛弃),然后转换成有符号(0 111 1111),再对其进行取反,(1 111 1111) -> (1 1000 0000)=-128. 但是这样就变成9位数了,因此我认为,系统在对有符号int进行取反的操作时,并没有真正对其低位补1,而是人为的规定了 1 000 0000 这个负数的起点 就是-1,而不是-0。 */ }
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved