整理C/C++中的64位整型

本文详细介绍了C++中64位整型的不同表示方法,包括long long、_int64 和 __int64,解释了它们在不同编译器环境下的支持情况,并给出了打印这些类型变量时使用的格式说明符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇文章转载自:VC驿站:http://www.cctry.com/thread-277221-1-1.html

最近给大家录制讲解C++基础方面的教程,刚讲到数据类型这块。地址如下:http://www.cctry.com/thread-277142-1-1.html


关于基本类型中的整型,默认的一些 short、int、long 等大家都比较熟悉。int、long 占用 4 个字节32位,最大能表示的无符号正整数也才是 4294967295,也就是 42亿多。现如今社会中各种各样的数量需要整型来表示,但数目已远远超过 4294967295,比如当今的世界人口,等等。比如开发过程中经常要用到的毫秒级时间戳,即代表从1970年到现在为止经过的毫秒数。这些数值都超过了 4294967295,普通的 int 和 long 已经无法表示的下了,所以又出现占用 8个字节的64位整型:long long、_int64、__int64,其无符号能表示的最大正整数是:18446744073709551615,已经非常大了。。。可为什么有三种?下面给大家说下!

C99标准以前:
64位整型是一种没有明确规范的数据类型,各种主流的编译器对64位整型的支持也是标准不一,形态各异。于是便出了 long long、_int64、__int64 这么几种;

C99标准推出:
C99将 long long 纳入到 C++标准中,并规定 long long 类型的位数不低于64位;
Linux上GCC从4.5版本开始,完全支持C99标准,因此可以使用 long long 表示64位整数;
Windows 下 VC6.0 是1998年推出的,所以不支持C99标准,但是Windows为了支持64位整型,自己提供了__int64 类型来表示64位整数,VC6.0中还可以使用少一个下划线的版本 _int64

C++11标准推出:
long long 进入了 C++11 标准,同样定义为位数不低于64位;
GCC4.8开始支持 C++11,将 long long 型定义为64位,Visual Studio 2013 开始支持 C++11,同样将 long long 定义为64位。

备注:不过微软为了支持以前的程序代码,所以在 VC6.0 以及以后的编译器中都支持 _int64 及 __int64 类型。

好了,8个字节64位的整型我们搞清楚了之后,那么在进行打印输出或者格式化字符串的时候,用 % 什么呢?普通的 %d 肯定是不行了,应该用什么呢?

long long => %lld
unsigned long long => %llu
__int64 => %I64d

unsigned __int64 => %I64u

OK了,基本就给大家讲完了。为了通用性和移植性,建议大家还是使用 long long 类型吧,不过如果大家手头还是古董级别的 VC6.0 或者 低于支持 C++11 标准版本的编译器:VS2002、VS2003、VS2005、VS2008、VS2010、VS2012,那么只能使用 __int64 了。

有的网友会说了,long long 太长了,unsigned long long 更长,还是不如 __int64 方便!其他网友要说了,你直接 typedef 一下不就得了就可以使用短名字了:
typedef signed long long                TSint64;

typedef unsigned long long                TUint64;

这样定义完之后可以直接使用 TSint64 和 TUint64 了。

以上!

本篇文章转载自:VC驿站:http://www.cctry.com/thread-277221-1-1.html

### C++ 中 `qsort` 函数的使用方法 在 C++ 编程中,虽然推荐使用标准模板库(STL)中的 `std::sort` 来实现更高效和灵活的排序功能,但有时仍然会用到 C 标准库中的 `qsort` 函数。以下是关于如何正确使用 `qsort` 的详细介绍。 #### 1. 头文件引入 为了使用 `qsort` 函数,需要包含头文件 `<cstdlib>` 或者其对应的旧版本 `<stdlib.h>`[^4]。 ```cpp #include <cstdlib> ``` #### 2. 参数说明 `qsort` 函数具有以下签名: ```cpp void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *)); ``` - **`base`**: 指向待排序数组的第一个元素的指针。 - **`nitems`**: 数组中元素的数量。 - **`size`**: 单个元素所占字节数。 - **`compar`**: 用户自定义的一个比较函数,用于指定排序逻辑。 #### 3. 自定义比较函数 `qsort` 需要用户提供一个比较函数来决定元素之间的顺序关系。此函数接受两个指向常量数据的指针作为输入参数,并返回整数值以指示它们的关系[^3]。 - 返回负数表示第一个参数小于第二个; - 返回零表示两者相等; - 返回正数则意味着前者大于后者。 下面是一个简单的例子展示如何创建并应用这样一个对比规则去排列基本类型如整型数组。 #### 4. 示例代码 假设我们有一个整数数组 `{97, 65, 81, 3}`, 并希望将其按升序方式重新安排,则可编写如下程序片段: ```cpp // 定义比较函数 int compare(const void* a, const void* b){ return (*(int*)a - *(int*)b); // 对于整形可以直接这样写 } int main(){ int array[] = {97, 65, 81, 3}; int length = sizeof(array)/sizeof(array[0]); // 调用qsort进行排序 qsort(array, length, sizeof(int), compare); // 输出结果验证 for(auto i : array){ printf("%d ",i); } } ``` 上述代码段展示了完整的流程——从初始化目标集合直到最终打印已整理好的序列[^5]。 注意:尽管这里演示的是针对基础数据类型的处理过程,实际上借助适当设计过的回调机制,也可以轻松扩展至复杂对象乃至用户自定结构体实例上执行类似的组织操作。 #### 5. 排序复合数据类型 当面对诸如含有多个字段记录组成的表单时,可以通过调整我们的比较器行为从而满足特定需求下的定制化次序设定。例如考虑之前提到过的情况 —— 给定一组由两部分构成的整体单元 (struct),期望依据某些计算得出的结果来进行整体上的编排置分配。 ```cpp typedef struct { int a; int b; } Num; bool cmp(Num lhs, Num rhs) noexcept{ return ((lhs.a + lhs.b) > (rhs.a + rhs.b)); } static int comparator(const void* p1,const void*p2 ){ auto& v1=*(reinterpret_cast<Num*>(p1)); auto& v2=*(reinterpret_cast<Num*>(p2)); if(v1.a+v1.b>v2.a+v2.b)return -1;//降序 else if((v1.a+v1.b)==(v2.a+v2.b))return 0; else return 1; } int main(){ Num nums[]={ {1,2},{3,4},{5,-6}}; std::cout<< "Before Sorting:\n"; for(auto &item:nums){printf("(%d,%d)\n", item.a,item.b);} qsort(nums,sizeof(nums)/sizeof(*nums),sizeof(*nums),(int(*)(const void*,const void*))comparator ); std::cout<<"\nAfter Sorting:\n"; for(auto &item:nums){printf("(%d,%d)\n", item.a,item.b);} return EXIT_SUCCESS; } ``` 在这个案例里,通过重载运算符或者手动制定评判准则的方式实现了基于成员属性总和值高低判定先后座次的功能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值