size_t,ssize_t,int和long的区别
来源:互联网 发布:华泰证券行情软件 编辑:程序博客网 时间:2024/04/30 10:29
----------------------------------size_t--------------------------------------
size_t是一些C/C++标准在stddef.h中定义的。这个类型足以用来表示对象的大小。
size_t的真实类型与操作系统有关,在32位架构中被普遍定义为:
typedef unsigned int size_t;
而在64位架构中被定义为:
而int在不同架构下都是4字节,与size_t不同;且int为带符号数,size_t为无符号数。
参考:size_t在WikiPedia上的词条
size_t是无符号的,并且是平台无关的,表示0-MAXINT的范围;
int是有符号的;
具体可参考:http://123.125.115.53/view/3236587.htm
---------------------------------------ssize_t------------------------------------------------------------
ssize_t是有符号整型,在32位机器上等同与int,在64位机器上等同与long int,有没有注意到,它和long数据类型有啥区别?其实就是一样的。size_t 就是无符号型的ssize_t,也就是unsigned long/ unsigned int (在32位下),不同的编译器或系统可能会有区别,主要是因为在32位机器上int和long是一样的。
typedef long ssize_t;//ssize_t就是long类型
-----------------------------------size_t和ssize_t----------------------------------------------
size_t是什么类型的?
解释一:为了增强程序的可移植性,便有了size_t,它是为了方便系统之间的移植而定义的,不同的系统上,定义size_t可能不一样。
typedef unsigned long size_t
解释二:ssize_t是signed size_t。
size_t是标准C库中定义的,应为unsigned int。定义为typedef int ssize_t。
而ssize_t:这个数据类型用来表示可以被执行读写操作的数据块的大小.它和size_t类似,但必需是signed.意即:它表示的是sign size_t类型的。
《Unix 高级环境编程》里面是这么说的:
原始系统数据类型
前面所示的getpid函数的原型定义了其返回值为pid_t类型,这也是POSIX中的新规定。
UNIX的早期版本规定此函数返回一整型。与此类似, read和write返回类型为ssize_t的值,并
要求第三个参数的类型是size_t。
以_ t结尾的这些数据类型被称为原始系统数据类型。它们通常在头文件<sys/types.h>中定
义(头文件<unistd.h>应已包括该头文件)。它们通常以C typedef说明加以定义。typedef说明在C
语言中已超过1 5年了(所以这并不要求ANSI C),它们的目的是阻止程序使用专门的数据类型
(例如int , short或long) 来允许对于一种特定系统的每个实现选择所要求的数据类型。在需要存储
进程I D的地方,分配类型为pid_t的一个变量(注意,程序1 - 5已对名为pid的变量这样做了)。在
各种不同的实现中,这种数据类型的定义可能是不同的,但是这种差别现在只出现在一个头文
件中。我们只需在另一个系统上重新编辑应用程序。
=============================================================
C语言中size_t的陷阱
#include <stdio.h>#include <string.h>int main(){ int i = -1; if(i > strlen("Demon")) printf("Hello World"); else printf("Hello Demon"); return 0;}
输出的竟然是Hello World!-1 > 5?!
仔细想想,原来问题出在strlen上,strlen返回的类型是size_t,size_t的定义为:
typedef unsigned int size_t;
即无符号的整型,而i的类型是int,即有符号的整型。当有符号整型和无符号整型进行运算时,有符号整型会先自动转化成无符号。-1转化成无符号数为4294967295,远远大于5。
今后遇到有符号数和无符号数之间的运算时要千万小心。
参考:http://demon.tw/programming/c-size_t-pitfall.html- size_t,ssize_t,int和long的区别
- size_t,ssize_t,int和long的区别
- size_t,ssize_t,int和long的区别
- size_t、ssize_t、int、long的比较
- size_t ssize_t loff_t 的区别
- size_t ssize_t loff_t 的区别
- size_t ssize_t loff_t 的区别
- size_t和int的区别
- int、long和long long的区别
- Size_t和int区别
- size_t 和 ssize_t
- size_t和 ssize_t类型
- size_t和ssize_t
- ssize_t和size_t详解
- size_t和ssize_t
- ssize_t和size_t类型
- size_t 和 unsigned int, unsigned long
- int和long的区别
- 当前许多嵌入式开发系统只支持C语言吗?
- 观察者模式(监听器模式)
- ubuntu下开机自动运行脚本、定时运行脚本
- OGRE学习笔记之 配置文件 Ogre.cfg
- Qt调用dll中的功能函数
- size_t,ssize_t,int和long的区别
- qt日记:使用UI里面的转到槽机制没有使用信号与槽的方式编写的代码运行稳定
- 旅行商问题的遗传算法-JAVA
- 在centOS6中安装nvidia显卡驱动
- android设备添加F1-F12按键功能
- 杭电2147
- 对称加密解密类
- 嵌入式 视h264频采集过程中降低网络带宽问题解决方案
- 简要说JUnit的4大功能