int64_t 在 32 位环境下其实是 long long
这里说的类型长度指的是相同类型在不同环境下长度不一致的情况,下面总结表格:
由于这里出现了 32 位和 64 位环境下长度不一致的情况,C 语言特意提供了 stdint.h 头文件 (C++ 中在 cstddef 中引用),定义了定长类型,例如 int64_t 在 32 位环境下其实是 long long,而在 64 位环境下其实是 long。
但这里的问题点在于:
并没有定长格式符
例如 uint64_t 在 32 位环境下对应的格式符是 % llu,但是在 64 位环境下对应的格式符是 % lu。有一种折中的解决办法是自定义一个宏:
#if(sizeof(void*) == 8)
#define u64 "%lu"
#else
#define u64 "%llu"
#endifvoid demo() {uint64_t a;printf("a="u64, a);
}
但这样会让字符串字面量从中间断开,非常不直观。
类型不一致
例如在 64 位环境下,long 和 long long 都是 64 位长,但编译器会识别为不同类型,在一些类型推导的场景会出现和预期不一致的情况,例如:
template <typename T>
void func(T t) {}template <>
void func<int64_t>(int64_t t) {}void demo() {long long a;func(a); // 会匹配通用模板,而匹配不到特例
}
上述例子表明,func<int64_t> 和 func<long long > 是不同实例,尽管在 64 位环境下 long 和 long long 真的看不出什么区别,但是编译器就是会识别成不同类型。
格式化字符串
格式化字符串算是非常经典的 C 的产物,不仅是 C++,非常多的语言都是支持这种格式符的,例如 java、Go、python 等等。
但 C++ 中的格式化字符串可以说完全就是 C 的那一套,根本没有任何扩展。换句话说,除了基本数据类型和 0 结尾的字符串以外,其他任何类型都没有用于匹配的格式符。
例如,对于结构体类型、数组、元组类型等等,都没法匹配到格式符:
struct Point {double x, y;
};void Demo() {// 打印PointPoint p {1, 2.5};printf("(%lf,%lf)", p.x, p.y); // 无法直接打印p// 打印数组int arr[] = {1, 2, 3};for (int i = 0; i < 3; i++) {printf("%d, ", arr[i]); // 无法直接打印整个数组} // 打印元组std::tuple tu(1, 2.5, "abc");printf("(%d,%lf,%s)", std::get<0>(tu), std::get<1>(tu), std::get<2>(tu)); // 无法直接打印整个元组
}
对于这些组合类型,我们就不得不手动去访问内部成员,或者用循环访问,非常不方便。
针对于字符串,还会有一个严重的潜在问题,比如:
std::string str = "abc";
str.push_back('\0');
str.append("abc");char buf[32];
sprintf(buf, "str=%s", str.c_str());
由于 str 中出现了 '\0',如果用 % s 格式符来匹配的话,会在 0 的位置截断,也就是说 buf 其实只获取到了 str 中的第一个 abc,第二个 abc 就被丢失了。
int64_t 在 32 位环境下其实是 long long相关推荐
- 实况10硬盘版在win7,64位环境下如何使用
在XP,或者win7,32位环境下,实况10免安装版只需要双击一个注册信息,将数据信息添加到注册表中即可,但是在64位中,这样做后,打开软件会弹出提示:the game is not properly ...
- 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16...
一.Intel 32 位处理器的工作模式 如上图所示,Intel 32 位处理器有3种工作模式. (1)实模式:工作方式相当于一个8086 (2)保护模式:提供支持多任务环境的工作方式,建立保护机制 ...
- 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16
一.Intel 32 位处理器的工作模式 如上图所示,Intel 32 位处理器有3种工作模式. (1)实模式:工作方式相当于一个8086 (2)保护模式:提供支持多任务环境的工作方式,建立保护机制 ...
- python3.7 win10 64位系统下用pyinstaller打包的程序在32位系统下无法运行
问题背景: 在64位的win10系统下,用python 3.7.4 写了个定时报警的小玩意儿,主要用到了pyaudio模块,写完之后,使用pyinstaller打包成.exe文件,在其他64位的电脑下 ...
- java安装32位环境遇到的问题
java安装32位环境遇到的问题,.pack文件解压为jar文件 前言 window下强制杀死某个java进程 彻底删除安装的JAVA环境 java开发包内部错误61003 .pack文件解压为jar ...
- windows7 64位环境下安装apache+mysql5.5+php7经验
安装环境时遇到的一写问题现总结如下: 整体都是 windows64位环境下 vc14 首先电脑上安装的是vs2015环境 安装顺序: 1.首先安装apache2.4安装包,解压即可 2.php7压 ...
- linux32位运行64位程序,32位windows下可以运行的程序在64位linux下报错
已结贴√ 问题点数:20 回复次数:3 32位windows下可以运行的程序在64位linux下报错 filt.c在32位windows code:blocks 10.05下运行无任何异样. 传到64 ...
- python2.7安装教程win7_win7 64位环境下,为python2.7 安装pip
第一步: 安装python并配置好环境变量 第二步: 下载setuptools源码setuptools-38.5.1.zip,地址:https://pypi.python.org/pypi/setup ...
- win10,64位环境下curl7下载安装和配置详细图文教程(亲测有效)
win10,64位环境下curl7下载安装和配置教程 一.前期准备: (1)windows10,64位: (2)python3.8 二.下载: 三.安装: 四.环境变量配置: (1)新建 ==CURL ...
最新文章
- html 逗号用什么替换,字符串用javascript数组中的逗号替换“↵”
- RDKit:化合物相似性搜索
- 用时间换才华:李开复给创业者的7条时间管理建议 【转载】
- Xcode 添加前缀
- redis集群的几种模式
- python语言逆序符号_python的逆序
- 原生jsonp发送跨域请求
- Microsoft Azure 大计算 – 宣布收购 GreenButton
- css 背景色半透明 子元素不透明
- 【图像处理】基于matlab GUI图像直方图+滤波处理【含Matlab源码 839期】
- [渝粤教育] 江苏农牧科技职业学院 兽医文化 参考 资料
- 聊天记录怎么录视频 微信聊天记录屏幕录制
- Loss和神经网络训练
- Delphi Thread 多线程编程(6)
- win 10计算机文件,Win10电脑怎么转移c盘文件?
- keystore导出p12,cer,crt,.key.pem证书文件格式
- BZOJ 3573 [HNOI2014]米特运输
- 第三届蓝桥杯JavaC组国(决)赛真题
- 自已写的“动易PowerEasy2006暴库工具”
- 设计模式之禅(第2版)