C C size t 資料型別

2021-09-25 17:07:30 字數 2545 閱讀 1912

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和size_t類似,但必需是signed(表示 signed size_t型別), 用來表示可以被執行讀寫操作的資料塊的大小。

為了保證平台的通用性,程式中盡量不要使用long資料庫型。可以使用固定大小的資料型別巨集定義,這些巨集定義需要引用stdint.h標頭檔案:

typedef signed char int8_t

typedef short int int16_t;

typedef int int32_t;

# if __wordsize == 64

typedef long int int64_t;

# else

__extension__

typedef long long int int64_t;

#endif

使用int時也可以使用intptr_t來保證平台的通用性,它在不同的平台上編譯時長度不同,但都是標準的平台字長,比如64位機器它的長度就是8位元組,32位機器它的長度是4位元組,使用它可以安全地進行整數與指標的轉換運算,也就是說當需要將指標作為整數運算時,將它轉換成intptr_t進行運算才是安全的。intptr_t需要引用stddef.h標頭檔案,它的定義如下:

#if __wordsize == 64

typedef long int intptr_t;

#else

typedef int intptr_t;

#endif

它們分別是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來替代它。

參考:

資料型別基礎資料型別

資料型別 基礎型別 除八大基礎型別其他的都是引用型資料型別 引用資料型別 基礎資料型別 整型 byte 佔乙個位元組,範圍 128 127 short 佔兩個位元組,範圍 32768 32767 int 最常用 佔四個位元組,範圍 2147483648 2147483647 long 佔八個位元組 ...

資料型別 基本資料型別和引用資料型別

一.分類 1,五種簡單資料型別 基本資料型別 number,string,boolean,null,undefined,新增symbol es6 基本資料型別是指存放在棧中的簡單資料段,資料大小確定,記憶體空間大小可以分配,它們是直接按值存放的,所以可以直接按值訪問。1 undefined 宣告的變...

SQL 資料型別 MySQL 資料型別

在 mysql 中,有三種主要的型別 文字 數字和日期 時間型別。資料型別 描述char size 儲存固定長度的字串 可包含字母 數字以及特殊字元 在括號中指定字串的長度。最多 255 個字元。varchar size 儲存可變長度的字串 可包含字母 數字以及特殊字元 在括號中指定字串的最大長度。...