size_t和ssize_t

转载 2016年08月28日 15:50:43

首先,我非常肯定以及确定的告诉你ssize_t是有符号整型,在32位机器上等同与int,在64位机器上等同与long int,有没有注意到,它和long数据类型有啥区别?其实就是一样的。size_t 就是无符号型的ssize_t,也就是unsigned long/ unsigned int (在32位下),不同的编译器或系统可能会有区别,主要是因为在32位机器上int和long是一样的。在64位没有测试,但是参见百度百科,size_t 在64位下是64位,那么size_t的正确定义应该是typedef unsigned long size_t。

ssize_t:

前一阵子,上Unix程序设计,问老师说ssize_t到底是什么数据类型,老师说,你直接用就好了,真要知道是什么数据类型,可以去types.h里去看一下,回去以后找了一下没有找到就放弃了,今天写代码又遇到这个问题,我觉得不是办法,还是得弄清除它到底是什么类型。当然了,对于ssize_t到底是什么数据类型,不知道问题也不大,但是对于控制欲强和好奇心重的人,总是想知道的,而且我相信,知道了总会有好处的,写代码的时候心里有底。

查找步骤:
1. 包含头文件的时候是这么做的:#include

#ifndef __ssize_t_defined
typedef __ssize_t ssize_t;
# define __ssize_t_defined
3. 再搜索__ssize_t 就找不到任何有价值的信息了,观察文件发现,该文件还包含了其他头文件,也就是 #include <bits/types.h>,再次打开bits/types.h
4. 搜索__ssize_t 找到了这么一条语句:__STD_TYPE __SSIZE_T_TYPE __ssize_t; 搜索__STD_TYPE_SSIZE 又找到了这样一句话:
/* We want __extension__ before typedef's that use nonstandard base types
   such as `long long' in C89 mode.  */
# define __STD_TYPE             __extension__ typedef

也就是说,__STD_TYPE __SSIZE_T_TYPE __ssize_t;这条语句其实就是 typedef __SSIZE_T_TYPE __ssize_t,那么重点就是找到__SSIZE_T_TYPE了,搜索__SIZE_T_TYPE,又没有什么有价值的信息了,与步骤3类似,我们又找到了这条语句:#include

#if __WORDSIZE == 32
# define __SQUAD_TYPE           __quad_t
# define __UQUAD_TYPE           __u_quad_t
# define __SWORD_TYPE           int
# define __UWORD_TYPE           unsigned int
# define __SLONG32_TYPE         long int
# define __ULONG32_TYPE         unsigned long int
# define __S64_TYPE             __quad_t
# define __U64_TYPE             __u_quad_t
/* We want __extension__ before typedef's that use nonstandard base types
   such as `long long' in C89 mode.  */
# define __STD_TYPE             __extension__ typedef
#elif __WORDSIZE == 64
# define __SQUAD_TYPE           long int
# define __UQUAD_TYPE           unsigned long int
# define __SWORD_TYPE           long int
# define __UWORD_TYPE           unsigned long int
# define __SLONG32_TYPE         int
# define __ULONG32_TYPE         unsigned int
# define __S64_TYPE             long int
# define __U64_TYPE             unsigned long int
/* No need to mark the typedef with __extension__.   */
# define __STD_TYPE             typedef
#else
# error
#endif
   我们几乎都可以猜到__WORDSIZE是什么意思了,它的定义在#include <bits/wordsize.h>中,表示计算机系统是几位的。从上面我们知道,在32位计算机系统中,ssize_t 是int型,占4个字节,在64位计算机系统中,ssize_t是long int 型,占8个字节。

size_t:

晕,size_t的资料居然找了半天。size_t大家都知道,是无符号整型,在/usr/include/i386-linux-gnu/sys/stddef.h下看到这么几条语句:
/* __size_t is a typedef on FreeBSD 5!, must not trash it. */
#else
#define __size_t
#endif
#ifndef __SIZE_TYPE__
#define __SIZE_TYPE__ long unsigned int
#endif
#if !(defined (__GNUG__) && defined (size_t))
typedef __SIZE_TYPE__ size_t;
#ifdef __BEOS__
typedef long ssize_t;

可以肯定的是,size_t是无符号整型,至于是long型,还是int型,可能不同的编译器有不同的定义,我这里没有64位的机器,无法验证。这也验证了我们上面所说的ssize_t其实就是一个long。
下面的是一点附加资料,证明我找到的是正确的。:-)
一个基本的无符号整数的C / C + +类型。 它是sizeof操作符返回的结果类型。 该类型的大小是选择,因此,它可以存储在理论上是可能的任何类型的数组的最大大小。 在32位系统为size_t将采取32位和64位 - 64位。
参考资料:http://baike.baidu.com/view/3236587.htm
Data Type: ssize_t
This data type is used to represent the sizes of blocks that can be read or written in a single operation. It is similar to size_t, but must be a signed type.
参考资料:http://www.delorie.com/gnu/docs/glibc/libc_239.html

size_t与ssize_t

 size_t与ssize_t为了增强程序的可移植性,便有了size_t,它是为了方便系统之间的移植而定义的,不同的系统上,定义size_t可能不一样。l          在32位系统上定义为uns...
  • 21aspnet
  • 21aspnet
  • 2007年03月24日 17:16
  • 7364

size_t、ssize_t、int、long的比较

size_t、ssize_t、int、long是c和c++编程里面常用的类型。 很多人在第一次看到size和ssize的时候都会有点迷惑。 这里对它们的特点进行简单的比较和总结。...
  • fish43237
  • fish43237
  • 2015年01月12日 01:07
  • 3646

linux中的size_t和ssize_t

size_t 反映内存中对象的大小(以字节为单位),ssize_t 供返回字节计数或错误提示的函数使用。 size_t 的定义在: /usr/include/linux/types.h ...
  • avrmcu1
  • avrmcu1
  • 2013年11月10日 23:29
  • 4305

size_t,ssize_t,int和long的区别

size_t是一些C/C++标准在stddef.h中定义的。这个类型足以用来表示对象的大小。 size_t的真实类型与操作系统有关,在32位架构中被普遍定义为: 1 typede...
  • bzhxuexi
  • bzhxuexi
  • 2014年02月25日 09:56
  • 10910

C++中 打印size_t 和 ssize_t

#Use the z modifier: size_t x; ssize_t y; printf("%zu\n", x); // prints as unsigned decimal printf...
  • yuleslie
  • yuleslie
  • 2012年06月29日 18:23
  • 8483

ssize_t和size_t详解

对于赶时间的朋友,只看第一段就好了。    首先,我非常肯定以及确定的告诉你ssize_t是有符号整型,在32位机器上等同与int,在64位机器上等同与long int,有没有注意到,它和long数...
  • lplp90908
  • lplp90908
  • 2015年12月26日 00:12
  • 3829

size_t在printf的正确输出方法

#if defined(_MSC_VER) #define JL_SIZE_T_SPECIFIER "%Iu" #define JL_SSIZE_T_SPECIFIER "%Id" #defin...
  • yanlin1989812
  • yanlin1989812
  • 2014年03月25日 15:04
  • 3981

size_t的定义

size_t和ssize_t是ANSI C提供的标准头文件里定义的一个“数据类型”,其实并不是新的数据类型,不是关键字,是通过typedef从已有数据类型定义而来。 ANSI C总共提供了24个头文...
  • a1232345
  • a1232345
  • 2015年06月16日 11:36
  • 1420

ssize_t and size_t

http://www.delorie.com/gnu/docs/glibc/libc_239.htmlData Type: ssize_t   This data type is used to re...
  • xx_snoopy
  • xx_snoopy
  • 2008年11月24日 21:08
  • 409

20101016作业 —— my_getline

MAN 手册解释:NAME       getline, getdelim - delimited string inputSYNOPSIS       #define _GNU_SOURCE    ...
  • essencelite
  • essencelite
  • 2013年09月18日 21:12
  • 563
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:size_t和ssize_t
举报原因:
原因补充:

(最多只允许输入30个字)