1. 程式人生 > >c++中size_t與ssize_t詳解

c++中size_t與ssize_t詳解

----------------------------------size_t--------------------------------------

size_t是一些C/C++標準在stddef.h中定義的。這個型別足以用來表示物件的大小。

size_t的真實型別與作業系統有關,在32位架構中被普遍定義為:

typedef   unsigned int size_t;

而在64位架構中被定義為:

typedef  unsigned long size_t;

size_t在32位架構上是4位元組,在64位架構上是8位元組,在不同架構上進行編譯時需要注意這個問題。

而int在不同架構下都是4位元組,與size_t不同;且int為帶符號數,size_t為無符號數。

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可能不一樣。

     在32位系統上 定義為 unsigned int 也就是說在32位系統上是32位無符號整形。在64位系統上定義為 unsigned long 也就是說在64位系統上是64位無符號整形。size_t一般用來表示一種計數,比如有多少東西被拷貝等。例如:sizeof操作符的結果型別是size_t,該型別保證能容納實現所建立的最大物件的位元組大小。 它的意義大致是“適於計量記憶體中可容納的資料專案個數的無符號整數型別”。所以,它在陣列下標和記憶體管理函式之類的地方廣泛使用。而ssize_t這個資料型別用來表示可以被執行讀寫操作的資料塊的大小.它和size_t類似,但必需是signed.意即:它表示的是signed 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的變數這樣做了)。在 各種不同的實現中,這種資料型別的定義可能是不同的,但是這種差別現在只出現在一個頭文 件中。我們只需在另一個系統上重新編輯應用程式。

轉:http://blog.csdn.net/wypblog/article/details/6818761

=============================================================

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