size_t

size_t 是一些C/C++标准在stddef.h中定义的,size_t 类型表示C中任何对象所能达到的最大长度,它是无符号整数。

它是为了方便系统之间的移植而定义的,不同的系统上,定义size_t 可能不一样。size_t在32位系统上定义为 unsigned int,也就是32位无符号整型。在64位系统上定义为 unsigned long ,也就是64位无符号整形。size_t 的目的是提供一种可移植的方法来声明与系统中可寻址的内存区域一致的长度。

size_t 在数组下标和内存管理函数之类的地方广泛使用。例如,size_t 用做sizeof 操作符的返回值类型,同时也是很多函数的参数类型,包括malloc 和strlen。

在声明诸如字符数或者数组索引这样的长度变量时用size_t 是好的做法。它经常用于循环计数器、数组索引,有时候还用在指针算术运算上。size_t 的声明是实现相关的。它出现在一个或多个标准头文件中,比如stdio.h 和stblib.h,典型的定义如下:

#ifndef __SIZE_T
#define __SIZE_T
typedef unsigned int size_t;
#endif

define 指令确保它只被定义一次。实际的长度取决于实现。通常在32 位系统上它的长度是32 位,而在64 位系统上则是64 位。一般来说,size_t 可能的最大值是SIZE_MAX。

打印size_t 类型的值时要小心。这是无符号值,如果选错格式说明符,可能会得到不可靠的结果。推荐的格式说明符是%zu。不过,某些情况下不能用这个说明符, 作为替代,可以考虑%u 或%lu。下面这个例子将一个变量定义为size_t,然后用两种不同的格式说明符来打印:

size_t sizet = -5;
printf("%d\n",sizet);
printf("%zu\n",sizet);

因为size_t 本来是用于表示正整数的,如果用来表示负数就会出问题。如果为其赋一个负数,然后用%d 和%zu 格式说明符打印,就得到如下结果:

-5
4294967291

%d 把size_t 当做有符号整数,它打印出-5 因为变量中存放的就是-5。%zu 把size_t 当做无符号整数。当-5 被解析为有符号数时,高位置为1,表示这个数是负数。当它被解析为无符号数时,高位的1 被当做2 的乘幂。所以在用%zu 格式说明符时才会看到那个大整数。

sizet = 5;
printf("%d\n",sizet); // 显示5
printf("%zu\n",sizet); // 显示5

因为size_t 是无符号的,一定要给这种类型的变量赋正数 。

ssize_t

ssize_t 和size_t类似,但必需是signed(表示 signed size_t类型), 用来表示可以被执行读写操作的数据块的大小。

size_t 和 int 比较

  • size_t在32位架构中定义为:typedef   unsigned int size_t;
  • size_t在64位架构中被定义为:typedef  unsigned long size_t;
  • size_t是无符号的,并且是平台无关的,表示0-MAXINT的范围;int为是有符号的;
  • int在不同架构上都是4字节,size_t在32位和64位架构上分别是4字节和8字节,在不同架构上进行编译时需要注意这个问题。
  • ssize_t有符号整型,在32位机器上等同与int,在64位机器上等同与 long int.

C语言编程需要注意的64位和32机器的区别

编程注意事项

为了保证平台的通用性,程序中尽量不要使用long数据库型。可以使用固定大小的数据类型宏定义,这些宏定义需要引用stdint.h头文件:

typedef signed char int8_t
typedef short int int16_t;
typedef int int32_t;
# if __WORDSIZE == 64typedef long int int64_t;
# else__extension__typedef long long int int64_t;
#endif

intptr_t

使用int时也可以使用intptr_t来保证平台的通用性,它在不同的平台上编译时长度不同,但都是标准的平台字长,比如64位机器它的长度就是8字节,32位机器它的长度是4字节,使用它可以安全地进行整数与指针的转换运算,也就是说当需要将指针作为整数运算时,将它转换成intptr_t进行运算才是安全的。intptr_t需要引用stddef.h头文件,它的定义如下:

#if __WORDSIZE == 64typedef long int intptr_t;
#elsetypedef int intptr_t;
#endif

使用ssize_t和size_t

它们分别是unsigned和signed size of computer word size。它们也是表示计算机的字长,在32位机器上是int型,在64位机器上long型。使用它们对于增加平台的通用性有很大好处,从某种意义上来说它们等同于intptr_t和uintptr_t。使用它们也需要引用stddef.h头文件。

socket的accept函数在有些操作系统上使用size_t是不正确的,因为accept接收的int*类型,而size_t的长度可能会超过int*的长度限制,导致错误。后来BSD使用sock_t来替代它。

参考:https://blog.csdn.net/fuxiaoxiaoyue/article/details/82747332

【C/C++】size_t 数据类型相关推荐

  1. size_t 数据类型

    size_t size_t 是一些C/C++标准在stddef.h中定义的,size_t 类型表示C中任何对象所能达到的最大长度,它是无符号整数. 它是为了方便系统之间的移植而定义的,不同的系统上,定 ...

  2. ctypes类数据类型

    python的官方文档里面有很多关于ctypes的描述,下面我截取了一部分便于自己以后再次查看,欢迎有需要的朋友也可以看看. class ctypes.c_byte 代表 C signed char ...

  3. c语言中字符怎么表示6,6、C语言中的字符串

    一.C语言中的字符串 字符串是一种重要的数据类型,但是C语言并没有显示的字符串数据类型,不像java有String ,OBC有NSString等等.所以C语言中的字符串一般以字符串常量的形式出现或者存 ...

  4. 嵌入式Linux小项目之图片编解码播放器(5)

    目录 一.jpg图片的显示原理分析 1.认识jpg图片 2.jpg图片如何显示 3.如何解码jpg图片 二.libjpeg介绍及开源库的使用方法 1.libjpeg介绍 2.libjpeg版本及下载资 ...

  5. C/C++中int的取值范围

    直接答案: 我们常常看到int取值范围为-32768-32767,实际上int的取值范围依赖于计算机系统,在16位机器中,int占16位,其中一位为符号位,所以取值范围为前面所说的-32768-327 ...

  6. C/C++内存申请和释放(一)

    这一篇主要介绍一下C中的malloc和free(当然在C++中它们也可以使用),下一篇将主要介绍一下C++中的new和delete 如有侵权,请联系删除,如有错误,欢迎大家指正,谢谢 0. mallo ...

  7. python ctypes中文帮助文档

    15.17.ctypes- 用于Python的外部函数库 2.5版中的新功能. ctypes是Python的外部函数库.它提供C兼容的数据类型,并允许在DLL或共享库中调用函数.它可以用于在纯Pyth ...

  8. Linux自学笔记------Day02 文件I/O

    一.open()系统调用 open( )系统调用用来将路径名称name 所指定的文件映射至一个文件描述符,并于映射成功后返回该文件描述符.文件位置会被设为零,而且会根据flags所指定的标志来打开该文 ...

  9. c语言中int默认是有符号还是无符号,C语言迷题:有符号数与无符号数的问题

    前些天偶然看到了一个收集C语言迷题的网站,很是感兴趣.本人对C/C++语言本身很是感兴趣,曾经做过几年相应的开发,也算是相对比较熟悉的了,但也被其中的一些问题给难住了,毕竟这些问题都是涉及到非常细节的 ...

  10. 【C语言】strlen()函数

    目录 一.strlen()函数的简介 二.strlen()函数的具体使用 三.使用strlen函数的注意事项 四.实现strlen函数功能的三种方式 1.计数器的方式 2.递归的方式 3.指针减指针的 ...

最新文章

  1. 【Python基础】分享5 款超牛逼的 Jupyter Notebook 插件!
  2. 实际中的WebRTC:STUN,TURN以及信令(五)
  3. AT4352-[ARC101C] Ribbons on Tree【dp,容斥】
  4. Zuul 2 –样本过滤器
  5. C# 实现程序最小化到托盘
  6. IPFS 相关开发资源汇总
  7. 校园网ensp模拟搭建
  8. Cg Programming In Unity Projection of Bumpy Surfaces
  9. Android仿keep运动轨迹动画,Android仿Keep运动休息倒计时圆形控件
  10. 朋友圈可以修改可见范围了
  11. IAssemblyDoc Interface 学习笔记
  12. 阿里云短信服务——短信发送验证码
  13. python杨辉三角函数_python杨辉三角输出指定行_使用python打印十行杨辉三角过程详解...
  14. word表格合并单元格后,光标居中
  15. FilterConfig的用法是什么?
  16. 细粒度识别 | 百度细粒度识别方案
  17. 自己动手 编译 armbian 适配开发板和电视盒子
  18. idea出现Can not set int field xxx to java.lang.Float 错误
  19. Hibernate中发生Session is closed 的另一种可能
  20. HAUT OJ 1508 zp与车费

热门文章

  1. 第四季-专题18-FLASH驱动程序设计
  2. 数据--第43课 - 图课后练习
  3. ftp 相关知识集合
  4. 区块链游戏《TmoLand明日世界》又叒叕更新了
  5. linux之正则匹配命令学习笔记
  6. luogu P1379 八数码难题(A*算法入门详细讲解)
  7. Android复习强化笔记(二)
  8. mac废纸篓清空的心得、mac设置不睡眠不待机不锁屏、如何快速锁屏待机睡眠、mac重启、mac学习的必备软件-城...
  9. 由乱序播放说开了去-数组的打乱算法Fisher–Yates Shuffle
  10. 在主函数中输入10个等长的字符串。用另一函数对他们排序