郭晓非吧 关注:19贴子:3,105
  • 7回复贴,共1

关于C语言long long

收藏回复

  • 222.170.16.*
很多人对C/C++中的整型不太了解,导致代码移植的时候出现问题,本人在此总结一下,若有描述错误,请务必指出,谢谢!

a. C/C++对整型长度的规定是为了执行效率,将int定义为机器字长可以取得最大的执行速度;
b. C/C++中整型包括:int, char 和 enum, C++中还包含bool类型,C99中bool是一个宏,实际为_Bool; 
c. C 和 C++ 对 enum 的规定有所不同,这里不描述;
d. 修饰整型正负的有 signed 和 unsigned,对于 int 默认为 signed;
e. 修饰 int 大小的有 short 和 long, 部分编译器还扩展了一些更长的整型,比如 long long 和 __int64, C99中增加了long long和unsigned long long;
f. int 的长度 与 机器字长相同, 16位的编译器上int长16位,32位的编译器上int长32位;
g. short int 的长度 小于等于 int 的长度,注意她们可能长度相等,这取决于编译器;
h. long int 的长度 大于等于 int 的长度,注意她们可能长度相等,这取决于编译器;
i. char 的长度应当可以包容得下一个字符,大部分系统中就是一个字节,而有的系统中可能是4个字节,因为这些系统中一个字符需要四个字节来描述;
j. char 的正负取决于编译器,而编译器的决定取决于操作系统,在不同的编译器中char可能等同于signed char,也可能等同于unsigned char;

总结:
a. 出于效率考虑,应该尽量使用int和unsigned int;
b. 当需要指定容量的整型时,不应该直接使用short、int、long等,因为在不同的编译器上她们的容量不相同。此时应该定义她们相应的宏或类型,比如在VC++6.0中,可以如下定义:
typedef unsigned char UBYTE;
typedef   signed char SBYTE;
typedef unsigned short int UWORD;
typedef   signed short int SWORD;
typedef unsigned int UDWORD;
typedef   signed int SDWORD;
typedef unsigned __int64 UQWORD;
typedef   signed __int64 SQWORD;
然后在代码中使用 UBYTE、SBYTE、UWORD 等,这样当代码移植的时候只需要修改相应的类型即可。
定义自己的类型虽然在代码移植的时候只需要修改一处即可,但仍然属于源代码级别的修改,所以 C++ 2.0 中将这些类型定义在模板中,可以做到代码移植时无需修改代码。
c. 在定义char时,一定要加上 signed 或 unsigned,因为她的正负在不同的编译器上并不相同。
d. 不要想当然的以为char是1字节长,因为她的长度在不同的编译器上并不相同。


1楼2006-04-20 18:08回复
    main()
    {\
     long long int numa,numb,num; 
     numa=111111111111111; 
     numb=111111111111111; 
     num=numa+numb; 
     printf("num=%I64d",num); 
     getch();
    }


    IP属地:广西禁言 |2楼2006-04-20 18:27
    回复
      2025-06-16 18:04:30
      广告
      • 222.170.23.*
      把{\后面的\ Del
      之后保存aandb64.c(注意是.c)就OK啦!


      3楼2006-04-21 12:38
      回复
        • 222.170.2.*
        DJGPP怎么做
        Dev C++通过


        4楼2006-04-21 17:25
        回复
          • 222.20.56.*
          long long int 和 long long 等价吗?我在DJGPP中编译可以通过的


          5楼2007-03-18 18:04
          回复
            • 221.214.176.*
            等价


            6楼2009-11-08 10:22
            回复
              偶然路过,路过


              IP属地:河南禁言 |7楼2010-07-29 17:57
              回复
                如何确定long long的长度?


                IP属地:黑龙江禁言 |8楼2012-06-05 11:59
                回复