博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
size_t的32位和64位兼容
阅读量:6377 次
发布时间:2019-06-23

本文共 2508 字,大约阅读时间需要 8 分钟。

hot3.png

strlen与sizeof返回的类型都为size_t,而size_t在32位和64位下有不同的定义:32位下typedef unsigned int size_t,64位下typedef unsigned long size_t。

如果需要用printf来打印size_t类型的变量,用%d会出现32/64下不兼容的情况,编译器会给出waring。解决办法是使用%Zd或者%zd。%zd是C99规定的,%Zd是GNU的扩展。

关于z的解释可以在下面看到:

The length modifier       Here, "integer conversion" stands for d, i, o, u, x, or X conversion.       hh     A following integer conversion corresponds to a signed  char  or              unsigned  char argument, or a following n conversion corresponds              to a pointer to a signed char argument.       h      A following integer conversion corresponds to  a  short  int  or              unsigned  short int argument, or a following n conversion corre‐              sponds to a pointer to a short int argument.       l      (ell) A following integer conversion corresponds to a  long  int              or  unsigned long int argument, or a following n conversion cor‐              responds to a pointer to a long int argument, or a  following  c              conversion  corresponds  to  a wint_t argument, or a following s              conversion corresponds to a pointer to wchar_t argument.       ll     (ell-ell).  A following integer conversion corresponds to a long              long  int  or  unsigned long long int argument, or a following n              conversion corresponds to a pointer to a long long int argument.       L      A following a, A, e, E, f, F, g, or G conversion corresponds  to              a long double argument.  (C99 allows %LF, but SUSv2 does not.)       q      ("quad".  4.4BSD  and  Linux libc5 only.  Don't use.)  This is a              synonym for ll.       j      A following integer conversion corresponds  to  an  intmax_t  or              uintmax_t argument.       z      A  following  integer  conversion  corresponds  to  a  size_t or              ssize_t argument.  (Linux libc5 has Z with this meaning.   Don't              use it.)       t      A  following integer conversion corresponds to a ptrdiff_t argu‐              ment.

当需要将size_t类型变量传参给int类型时,C语言下直接使用(int)强制转换,C++下最好是使用static_cast<int>了。

有时候会想strlen、sizeof的返回结果不会很大,有必要在64位下用unsigned long指定返回类型吗?再延伸一下思考,32位系统最多分配4G内存,一个程序可以吃4G以上的空间,这种需求是可能的,但对于一个程序来说是否有必要,开一个内存空间给一个指针,而这个空间就超过4G了?看看别人的说法:

size_t is guarenteed to be able to hold the size in bytes of any object you can allocate in memory. This usually tends to imply that it is the same size as a pointer, which in turn is typically the size of a CPU register.

参考:

   

转载于:https://my.oschina.net/ioslighter/blog/360368

你可能感兴趣的文章
微信自动跳转浏览器打开APP(APK)下载链接
查看>>
==与===的区别
查看>>
不同工具查看代码分支diff的差异
查看>>
白话Java I/O模型
查看>>
上传一张照片,让算法告诉你是否患有抑郁症
查看>>
VR厂商唯晶科技获2800万C+轮融资,曾开发过游戏《圣女之歌》
查看>>
Countly 19.02.1 发布,实时移动和 web 分析报告平台
查看>>
TCP连接中time_wait在开发中的影响-搜人以鱼不如授之以渔
查看>>
Oracle数据库机出新帮助不同规模企业迈向云端
查看>>
前端通信:ajax设计方案(六)--- 全局配置、请求格式拓展和优化、请求二进制类型、浏览器错误搜集以及npm打包发布...
查看>>
微服务分布式企业框架 Springmvc+mybatis+shiro+Dubbo+ZooKeeper+Redis+KafKa
查看>>
被《时代周刊》选为年度最佳发明,PS VR靠的竟然是价格
查看>>
通用唯一标识码UUID的介绍及使用。
查看>>
spring笔记--依赖注入之针对不同类型变量的几种注入方式
查看>>
Ajax的简单学习
查看>>
为npm配置taobao源
查看>>
zookeeper初探三 java客户端连接
查看>>
管理邮件用户
查看>>
导出DC数据以便以介质方式安装另一台域控制器
查看>>
Hibernate学习(八):检索方式
查看>>