【无标题】int64_t 与 uint64_t
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 中长度最小的类型。这里可以看到,十进制常量均为有符号类型,而八进制和十进制常量的类型有可能为无符号类型。
【无标题】int64_t 与 uint64_t相关推荐
- 关于WM_NCHITTEST消息(移动无标题对话框多个)
我为了移动一个无标题栏的窗体,使用了WM_NCHITTEST消息,这个消息大概如下: 通常,我们拖动对话框窗口的标题栏来移动窗口,但有时候,我们想通过鼠标在客户区上拖动来移动窗口. 一个容易想到的方案 ...
- mysql输入命令1002无标题_Linux下远程连接MySQL数据库的方法
步骤 1.在服务器端开启远程访问 首先进入mysql数据库,然后输入下面两个命令: grant all privileges on *.* to 'root'@'%' identified by 'p ...
- C# 系统应用之无标题窗体移动的两种方法
在做项目界面设计中,常常为了美观需要设置窗体属性"FormBorderStyle"(窗体边框和标题栏外观)为None无标题窗口.此时隐藏标题的窗口怎样实现移动呢?我根据自己的项目从 ...
- Android 置Activity全屏和无标题
今天,实在没有什么好些写的内容,所以在网上找了很久,才决定写这个博客.比较简单,还是想保持写博客的习惯. 一.在代码里设置全屏. Activity设置全屏和无标题栏,要用到andorid.view.W ...
- ActionBarActivity设置全屏无标题
新建的Activity继承自ActionBarActivity,设置全屏无标题本来非常easy的事,可是没想到app居然无缘无故的挂,要么就是白屏一片,要么就是黑屏.坑了我一个多小时.!! 原因是Ac ...
- android教程1009无标题,Android ActionBarActivity设置全屏无标题实现方法总结_Android_脚本之家...
Android ActionBarActivity设置全屏无标题实现方法总结 前言: 新建的Activity继承自ActionBarActivity,设置全屏无标题本来很简单的事,但是没想到app竟 ...
- MFC修改窗口无标题和标题信息,修改执执行文件图标
一.创建MFC后 窗口显示的是 无标题-工程名 修改方法在网上看到了几种,下面介绍下比较简单的一种: 1.在MianFrame.c文件中找到这个函数 BOOL CMainFrame::PreCreat ...
- Visual Studio Code中的无标题(工作区)
点击文件--将工作区另存为--重新将工作区重命名 即可 我进行更改的时候,发现我之前无标题(工作区)里的文件都消失了,还好发现只是软件里消失.电脑磁盘里保存还有这些文件,之后 打开软件--点击文件-- ...
- C++打印size_t和ssize_t和int64_t和uint64_t
1.main.c //定义:typedef unsigned int size_t; typedef unsigned int uint32_t;typedef signed int ssize_t; ...
最新文章
- python界面图片-python图形用户界面(六):可视化给图片添加上文字
- Linux常用端口查询命令及常见端口和端口分类
- android实现重复动画,android – 多次重复AnimatorSet动画
- String Modification CodeForces - 1316B(规律)
- 【codevs1722】【NOI1997】最优乘车,单元最短路?
- python零基础入门五小时教学_五小时轻松入门Python
- PAT (Basic Level) Practise (中文)-1034. 有理数四则运算(20)
- C#进制转换(二进制转十进制 十进制转16进制等)
- 功能测试Ⅱ——测试用例设计方法
- leaflet地图原理_Web地图呈现原理
- 自动售检票系统是基于计算机,车站自动售检票系统存在的必要性
- Acwing 1299. 五指山
- 20个最棒的英文电子书免费下载网站
- hdu 6592 Beauty Of Unimodal Sequence
- 推进交通安全文化建设,首先要建立科学的理念
- 阿里巴巴对工业互联网志在必得,阿里云如何啃硬骨头?
- usaco3.2.4 Feed Ratios
- jupyter notebook第三章numpy库的一些案例分析加相关函数的解析
- 游泳馆管理系统有什么用?能解决什么问题?
- 翻斗式雨量计的组成与工作原理