`
king_tt
  • 浏览: 2083144 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

C++中的long long和__int64类型(转载)

 
阅读更多

C语言中long long的用法

http://www.awuit.com/c-language-the-usage-of-long-long/

阿吴 | C/C++ | 十一月, 03 2009 | 5 Comments

在分析BT代码的过程中,遇到了这样的定义:long long line_position;很是纳闷,在C语言中我还没有见过这样的写法,网上搜了,资料也很少,最后在C语言标准与实现这本书中找到了关于long long的说法。在C语言的C99标准扩展了新的整数类型 long long,long是32位宽,占4个字节,long long通常被定义成 64 位宽,也就可以实现了在32位机器上可以扩展8字节的数据,GUN C也支持,当然在64位平台上就存在这个问题了。C99标准并没有硬性规定具体到某种平台上的某种整数类型究竟占用多少字节、能够表示多大范围的数值等,只是给出一条原则和一个参考数值集合,只要同时满足这两方面条件就算是符合 C 标准。
之后,我查看了C99标准:
—The rank of long long int shall be greater than the rank of long int,which
shall be greater than the rank of int,which shall be greater than the rank of short
int,which shall be greater than the rank of signed char.

意思是说:
long long 的级别高于 long ,long 的级别高于 int ,int 的级别高于 short ,short 的级别高于 char 。(另外有 _Bool 永远是最低级别)。级别高的整数类型的宽度大于等于级别较低的整数类型。


编译long long需要支持C99标准的编译器才行,VC并不支持,但有对应的类型__int64


C++ __int64用法

http://341871.blog.51cto.com/331871/71253


  在做ACM题时,经常都会遇到一些比较大的整数。而常用的内置整数类型常常显得太小了:其中long int 范围是[-2^31,2^31),即-2147483648~2147483647。而unsigned范围是[0,2^32),即0~4294967295。也就是说,常规的32位整数只能够处理40亿以下的数。
  那遇到比40亿要大的数怎么办呢?这时就要用到C++64位扩展了。不同的编译器对64位整数的扩展有所不同。基于ACM的需要,下面仅介绍VC6.0g++编译器的扩展。
  VC64位整数分别叫做__int64unsigned __int64,其范围分别是[-2^63, 2^63)[0,2^64),即-9223372036854775808~92233720368547758070~18446744073709551615(1800亿亿)。对64位整数的运算与32位整数基本相同,都支持四则运算与位运算等。当进行64位与32位的混合运算时,32位整数会被隐式转换成64位整数。但是,VC的输入输出与__int64的兼容就不是很好了,如果你写下这样一段代码:
1 __int64 a;
2 cin >>
a;
3 cout << a;

那么,在第2行会收到“error C2679: binary '>>' : no operator defined which takes a right-hand operand of type '__int64' (or there is no acceptable conversion)”的错误;在第3行会收到“error C2593: 'operator <<' is ambiguous”的错误。那是不是就不能进行输入输出呢?当然不是,你可以使用C的写法:
scanf("%I64d",&a);
printf("%I64d",a);
就可以正确输入输出了。当使用unsigned __int64时,把"I64d"改为"I64u"就可以了。
  OJ通常使用g++编译器。其64位扩展方式与VC有所不同,它们分别叫做long long unsigned long long。处理规模与除输入输出外的使用方法同上。对于输入输出,它的扩展比VC好。既可以使用
1 long long a;
2
cin>>a;
3 cout<<a;
也可以使用
scanf("%lld",&a);
printf("%lld",a);

使用无符号数时,将"%lld"改成"%llu"即可。
  最后我补充一点:作为一个特例,如果你使用的是Dev-C++g++编译器,它使用的是"%I64d"而非"%lld"


__int64的printf问题!

http://blog.chinaunix.net/u/19782/showart_403061.html


把Linux的东西移植到Windows 下, 问题真是多, 有时候感觉很是奇怪! 今天有遇到了一个!

__int64在 Windows下怎么输出的问题? 我还以为是强制转换的时候出问题了, 查了好长时间!

下面是测试代码, 已经通过Windws, Linux两个平台的测试了!

#include <stdio.h>

#ifdef _WIN32
typedef unsigned __int64 uint64_t;
#else
typedef unsigned long long uint64_t;
#endif

typedef unsigned int uint32_t;
typedef unsigned short uint16_t;
typedef unsigned char uint8_t;

int main(int argc, char *argv[])
{
uint32_t t321, t322, t323;
uint64_t t641, t642, t643;
uint8_t *p;

uint8_t t[64] =
{
0x4E, 0x7C, 0x00, 0x00, 0x00, 0x00,
0x4E, 0x7C, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x00, 0x00
};

printf(
"sizeof(uint64_t) = %d/n"
"sizeof(uint32_t) = %d/n"
, sizeof(uint64_t), sizeof(uint32_t));

p = t;
t321 = *(uint32_t *)p; p += 6;
t322 = *(uint32_t *)p; p += 6;
t323 = *(uint32_t *)p; p += 6;

printf("t321[%X].%d t322[%X].%d t323[%X].%d/n"
, t321, t321, t322, t322, t323, t323);

p = t;
t641 = *(uint32_t *)p; p += 6;
t642 = *(uint32_t *)p; p += 6;
t643 = *(uint32_t *)p; p += 6;

#ifdef _WIN32
printf("t641[%I64X].%I64d t642[%I64X].%I64d t643[%I64X].%I64d/n"
, t641, t641, t642, t642, t643, t643);
#else
printf("t641[%llX].%lld t642[%llX].%lld t643[%llX].%lld/n"
, t641, t641, t642, t642, t643, t643);
#endif

t641 = 0x1122334455667788;

#ifdef _WIN32
printf("%I64X %I64d /n", t641, t641);
#else
printf("%llX %lld /n", t641, t641);
#endif

return 0;
}


/*
Test Env:
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Microsoft Windows 2000 [Version 5.00.2195]

Result:
sizeof(uint64_t) = 8
sizeof(uint32_t) = 4
t321[7C4E].31822 t322[7C4E].31822 t323[4].4
t641[7C4E].31822 t642[7C4E].31822 t643[4].4
1122334455667788 1234605616436508552

--------------------------------------
Test Env:
gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-47.3)

Result:
sizeof(uint64_t) = 8
sizeof(uint32_t) = 4
t321[7C4E].31822 t322[7C4E].31822 t323[4].4
t641[7C4E].31822 t642[7C4E].31822 t643[4].4
1122334455667788 1234605616436508552
*/

在进行移植的时候可能用的上的:
#ifdef _WIN32
# define APR_UINT64_T_HEX_FMT "llx"
#else
# define APR_UINT64_T_HEX_FMT "I64x"
#endif

example:
sprintf(buf, "%" APR_UINT64_T_HEX_FMT, var);

#define HOST_WIDEST_INT_PRINT_DEC "%I64d"
#define HOST_WIDEST_INT_PRINT_UNSIGNED "%I64u"
#define HOST_WIDEST_INT_PRINT_HEX "0x%I64x"
分享到:
评论

相关推荐

    uint32_t格式转int格式算法

    提供了一种将uint32_t格式的数据转换为int格式数据的方法,在点云数据转换等领域具有一定的实际应用意义。

    类型转换long转int

    将 long 类型转换为 int 类型可能会导致截断,因为 long 变量可能存储的数据超出了 int 变量所能表示的范围。...在实际应用过程中,除非有明确的需求和充分的思考,一般情况下不建议将 long 类型强制转换为 int 类型。

    标准MFC WinSock ActiveX控件开发实例

    大家可以看到,该函数将最基本的若干中数据类型转换成了long类型,但VARIANT决不是个简单的谱,我将在后面继续揭开它的神秘面纱. 编写我们刚才的接口Connect(),代码代码如下: 在MFCWinSockCtrl.h中加入 SOCKET ...

    C++数据类型及取值范围

    C++数据类型及取值范围 1.基本数据类型: ①字符类型:char(字符型) 例:‘A’,’b’ ②整数类型:int(整型) 例:4563, 234, 885634 ③浮点类型:float(单精度型)、double(双精度型) 例:3.1456 , 0.9e12 ④空值...

    Jsoncpp支持longlong

    c++的Json支持源码,支持longlong、int、double等基础类型。

    C++。C++实验C++。C++实验

    long fac(int n); void fac(char* x,char* y); int main() {int n; long y; char a[20],b[20],c[40]; cout&lt;&lt;"Enter positive int:"; cin&gt;&gt;n; y=fac(n); cout!="; cout; cin&gt;&gt;a&gt;&gt;b; fac(a,b); } long fac(int n) {...

    Visual C++实用图像处理专业教程

    void Histgram(BYTE *image, int xsize, int ysize, long hist[256]); 5.计算直方图百分比 void CalHistPercent(long hist[], float hist_radio[], float &max_percent); 6.直方图平滑化 void Hist_smooth(long ...

    变量取值范围(c++)

    《C和指针》中写过:long与int:标准只规定long不小于int的长度,int不小于short的长度。 double与int类型的存储机制不同,long int的8个字节全部都是数据位,而double是以尾数,底数,指数的形式表示的,类似科学...

    C/C++中的sizeof运算符和size_t类型的详解

    sizeof的作用 sizeof是c的运算符之一,用于获取操作数被分配的内存...size_t是标准C库中定义的,应为unsigned int,在64位系统中为 long unsigned int。 sizeof返回的必定是无符号整形,在标准c中通过typedef将返回值

    远程文件系统客户端源码

    long __stdcall RFCFileSeek64(void* AFile, __int64* AOffset, long AOrigin); long __stdcall RFCFileFlush(void* AFile); long __stdcall RFCFileSetEOF(void* AFile); // 读取文件信息 long __stdcall ...

    c++查看各类型字符的数据长度

    c++编程查看各类型字符(char、int、long、long long)的数据长度

    c++一些基本的处理函数

    bool __stdcall encodebcd(BYTE *buf,long val,int bl); long __stdcall decodebcd(BYTE *buf,int bl); BYTE __stdcall checksum(BYTE *buf,int bl); BYTE __stdcall checkxor(BYTE *buf,int bl); void __stdcall ...

    C++ primer习题第二章

    Exercise 2.1: What are the differences between int, long, long long, and short? Between an unsigned and a signed type? Between a float and a double? Exercise 2.2: To calculate a mortgage payment, what...

    新手学习C++入门资料

    C++中还包括wchar_t数据类型,wchar_t也是字符类型,但是是那些宽度超过8位的数据类型。许多外文字符集所含的数目超过256个,char字符类型无法完全囊括。wchar_t数据类型一般为16位。 标准C++的iostream类库中包括...

    C/C++与Java各数据类型所占字节数的详细比较

    C/C++的数据类型: 一,整型 Turbo C: [signed] int 2Byte//有符号数,-32768~32767 unsigned int 2Byte //无符号数,只能表示整数0~65535  [signed] short [int] 2Byte  unsigned short [int] 2 Byte  long ...

    Linux&Windows 大华 摄像头C++SDK

    整合了Linux和Windows平台大华SDK C++接口,已调试。example: void CALL_METHOD Disconnect(LLONG lLoginID, char *pchDVRIP, LONG nDVRPort, LDWORD dwUser) {} DH_INIT(Disconnect, NULL); ...

    C++高低位字节交换类

    适用于c++语法下的环境,一般跨平台通讯程序时,涉及主机字节不一致情况,如Linux下的服务程序和windows下客户端程序通讯时,有可能需要做主机字节高低位交换,本类提供int、float、short、double、long型数据的字节...

    C与C的64位整型_A1

    1. long long 定义方式可以用于 gcc/g++,不受平台限制,但不能用于 VC6.0 2. __int64 是 Win32 平台编译器 64 位长整

    C++MFC教程

    在Windows中有各种GUI对象(不要和C++对象混淆),当你在进行绘图就需要利用这些对象。而各种对象都拥有各种属性,下面分别讲述各种GUI对象和拥有的属性。 字体对象CFont用于输出文字时选用不同风格和大小的字体。可...

    ACE_OS::mktime函数源代码

    static __time64_t __cdecl _make__time64_t ( struct tm *tb, int ultflag ) { __time64_t tmptm1, tmptm2, tmptm3; struct tm tbtemp; long dstbias = 0; long timezone = 0; _VALIDATE_RETURN( ( tb != ...

Global site tag (gtag.js) - Google Analytics