在使用C语言过程中可能需要接触长整数类型,其中包括固定长度数据类型的声明、输入输出函数的标志符等细节,在此记录。

int64_t 与 uint64_t

  C的标准只规定特定数据类型需要实现的最小长度,特定类型的具体长度取决于编译器实现。为了增强程序的可移植性,C99标准增加了对固定长度的整数类型的支持。

  对固定长度类型的定义位于头文件 stdint.h 中。其中包括固定长度有符号整数类型 intN_t 和固定长度无符号整数类型 uintN_t,分别表示固定占用 N bits长度的整数类型( N = 8、16、32、64)。

  图示为CodeBlock13.12中头文件 stdint.h 对 int64_t 和 uint64_t 的定义,可以看到它们是通过对 long long 和 unsigned long long 的 typedef 声明实现的。  

 

  

相应格式字符串

  对于定义在头文件 stdint.h 中的类型 ,其printf和scanf的格式字符串在头文件 inttypes.h 中实现。

printf输出

  对于printf使用的格式化标识符,一般格式为 PRI + format + type 。其中 format规定输出的格式,可以为 d( decimal ,十进制) 、h( hexadecimal ,十六进制) 、o( octal , 八进制)、u( unsigned ,无符号)等,type 为对应的数据类型,可以为 N 。( 实际type还可以为FASTN、LEASTN、PTR 和 MAX等,具体可见C data types - Wikipedia )

  如对于int64_t数据类型的输出,可以使用格式标志符 PRId64。

  

  实际上,各个格式化标志符的定义在头文件inttypes.h中。可以看到,实际可直接使用格式化标志符%I64d来输出 uint64_t类型。

  

  这也从解释了为什么需要将 PRIu64 独立书写,这是由于使用格式化字符串" %PRIu64 "时,编译器会将 " " 间的所有字符均视为字符串的一部分,这样在预处理阶段便无法对 PRIu64 的宏定义进行替换。将PRIu64独立出来后,其会在预编译阶段被替换为" I64u " (注意这里替换的结果包含引号),即格式化字符串变为 " % " " I64u " "\n",在C语言中被当作“ %I64u\n”处理,从而保证结果正确输出。

scanf输入

  对应的scanf使用的格式化标识符,一般格式为 SCN + format + type。其中 format规定输出的格式,可以为 d( decimal ,十进制) 、h( hexadecimal ,十六进制) 、o( octal , 八进制)、u( unsigned ,无符号)等,type 为对应的数据类型,可以为 N 。

  scanf的格式化标志符与printf中的定义方法大致相同,在头文件 inttypes.h 中存在相应的宏定义,如对无符号类型的输入的标识符如下图所示。

  

unsigned long long 与 long long 类型的输入与输出

  在CodeBlocks的头文件 stdint.h 中存在如下表述:

     

  一般而言C语言标准给出的 unsgned long long 与 long long 的格式化标识符分别为 llu 与 lli,但实在Windows环境下编译时,可能尚未提供对 " ll " 格式化标志符的支持,使得使用了以上两种格式化标识符的类型无法被正确识别。一种可行的解决方法是使用上述 int64_t 与 uint64_t 的格式化标识符,因为从头文件 stdint.h 的定义中我们可以发现,int64_t 与 uint64_t 分别就是 long long 与 unsigned long long 的 typedef 定义,故而可以使用 PRId64 和 PRIu64 来对 long long 类型与 unsigned long long 类型进行输出。

  需要注意的是,不同的机器和编译器对 int64_t 和 uint64_t 的实现可能并不相同,故而最好先在头文件 stdint.h 中确认具体的定义后再根据具体的定义使用对应的格式化标识符。

其他

  在程序设计时需要注意常数的类型问题,笔者在书写简单的测试程序时,使用如下方式,编译器报错"warning: left shift count >= width of type",即左移的长度大于了类型长度。

  

  这是由于C对常数的类型确认机制决定的。整数类型常量由其值和符号共同决定。其中十进制常量的类型是 int 、 long 和 long long 中能够容纳该常量的最小长度类型。故而上例中 1 被确认为 int 类型,长度在本机器上为 32bits,故而在进行编译时会出现错误。相应的,八进制和十六进制常量的类型是能容纳其值的 int 、unsigned int  、long 、unsigned long 、long long 和 unsigned long long 中长度最小的类型。这里可以看到,十进制常量均为有符号类型,而八进制和十进制常量的类型有可能为无符号类型。

  参考: C data types - Wikipedia

      stackoverflow printf and %llx in GCC under Windows 64x

C对64位整数类型的支持的更多相关文章

  1. CH0101 a^b & CH0102 64位整数乘法

    大数取模的两道题. 虐狗宝典学习笔记: 两个数值执行算术运算时,以参与运算的最高数值类型为基准,与保存结果的变量类型无关.两个32位整数的成绩可能超过int类型的表示范围,但是CPU只会用一个32位寄 ...

  2. C++的64位整数

    在做ACM题时,经常都会遇到一些比较大的整数.而常用的内置整数类型常常显得太小了:其中long 和 int 范围是[-2^31,2^31),即-2147483648~2147483647.而unsig ...

  3. C/C++中的64位整数

    C/C++中的64位整数(__int64 and long long) 在做ACM题时,经常都会遇到一些比较大的整数.而常用的内置整数类型常常显得太小了:其中long 和 int 范围是[-2^31, ...

  4. 在SSIS 的 64 位版本中不支持 Excel 连接管理器

    Microsoft sql server 2008 R2——> SQL SERVER Business Intelligence Development Studio 使用EXCEL数据源或目标 ...

  5. CH 0101 - a^b / CH 0102 - 64位整数乘法 - [快速幂和快速乘]

    0101 a^b 题目链接:传送门 描述 求 a 的 b 次方对 p 取模的值,其中 1≤a,b,p≤10^9 输入格式 三个用空格隔开的整数 a,b 和 p. 输出格式 一个整数,表示 a^b mo ...

  6. CH0101 a^b、 CH0102 64位整数乘法(快速幂、快速乘)【模板题】

    题目链接:传送门    //a^b   传送门    //64位整数乘法 题目: 描述 求 a 的 b 次方对 p 取模的值,其中 ≤a,b,p≤^ 输入格式 三个用空格隔开的整数a,b和p. 输出格 ...

  7. 在SSIS 的 64 位版本中不支持 Excel 连接管理器[转]

    Microsoft sql server 2008 R2——> SQL SERVER Business Intelligence Development Studio 使用EXCEL数据源或目标 ...

  8. excel 导入数据库 / SSIS 中 excel data source --64位excel 版本不支持-- solution

    当本地安装的excel(2013版) 是64-bit时:出现的以下两种错误 解决: 1. excel 导入数据库 , 如果文件是2007则会出现:“The 'Microsoft.ACE.OLEDB.1 ...

  9. 64位系统 IIS不支持 Excel导入的问题

    64位系统不支持读取excel的问题: 应用程序池-常规选项 启用32应用程序 启用23应用程序是为了保证32应用程序能够正常运行

随机推荐

  1. MyBatis中插入并返回主键

    开发过程中经常遇到需要插入一条数据,并且返回这条数据自增的主键,在MyBatis中只需要在mapper中添加keyProperty属性即可 在mapper中添加keyProperty属性 <in ...

  2. SQL Serever学习16——索引,触发器,数据库维护

    sqlserver2014数据库应用技术 <清华大学出版社> 索引 这是一个很重要的概念,我们知道数据在计算机中其实是分页存储的,就像是单词存在字典中一样 数据库索引可以帮助我们快速定位数 ...

  3. SQL Serever学习4

    SQL Server系统中数据库相关概念 在SQLServer数据库系统中分为2大类,系统数据库和用户数据库. SQLServer安装后系统会自动生成4个系统数据库,他们是Master,Model,M ...

  4. jquery选择器【总结】

    本文总结整理了jquery里和选择器相关的所有方法,通过这篇文章,可以让你学习到在jquery里使用选择器的所有方法. 一:基本选择器: $("#aijquery") 选择id值等 ...

  5. JS 监听键盘按键

    1. 实现Ctrl+ Enter 组合键触发事件 document.onkeydown=function(event){ var keyNum = window.event ? event.keyCo ...

  6. varchar(n)跟varchar(max)的区别

    本文来源于翁舒航的博客,点击即可跳转原文观看!!!(被转载或者拷贝走的内容可能缺失图片.视频等原文的内容) 若网站将链接屏蔽,可直接拷贝原文链接到地址栏跳转观看,原文链接:https://www.cn ...

  7. 基于.Net下整合IBatis

    一. 准备工作 1. 点击此下载支持.Net4.0的 iBatis.Net,工程中引用release文件夹下的dll 最新版(目前已不再更新),有稍作修改使其支持.NET4.0 2. 点击此可查看 i ...

  8. Dubbo(二) 一次惨痛的流血事故

    时间定位到2018年11月某某一天,我正在看看Spring源码的文档,趁着没啥事,忽然想起Dubbo是基于Schema扩展的,所以就翻了下Dubbo的源码. 然后的然后,有活要干了,写完代码后,启动工 ...

  9. process对象

    一.目录 process对象是Node的一个全局对象,提供当前Node进程的信息.它可以在脚本的任意位置使用,不必通过require命令加载.该对象部署了EventEmitter接口. 二.属性 pr ...

  10. px、em、pt之间的区别与互相转换

    关于px.pt和em的区别,自己有时候也会纠结到底该用什么单位,今天特意查了一些文章,下面这篇虽然很久远了,但解释的比较全面,转载收藏之.点击查看原文(原网址已失效,这是其他站点) 这里引用的是Jor ...