浅析size_t

最近在学C++的STL容器的模拟实现时,总是不可避免的接触到size_t这一类型定义的变量,感觉自己对其只有一个模糊的概念,所以在网上的整理如下:

C中的size_t

1、size_t 在C中是存在的,其表示一个无符号的“整型”类型,即其内保存一个整型数据,用来记录一个大小,strlen() 、sizeof()的返回值都是size_t类型的数值

size_t strlen(char* str);

2、若用printf()函数输出size_t类型的数据时,C99中定义了格式符%zd来输出;若编译器不支持的情况下,还可以尝试%u或%lu以无符号整数的格式控制符来输出

size_t res = 100;
printf("%zd", res);
//printf("%u", res);

3、既然size_t中保存的是整数类型数据,那么该数据也可进行加减乘除运算,也可以强制类型转换为int类型

size_t res = 100;
int num = (int)res;

4、类似的,还有wchar_t、ptrdiff_t
wchar_t即wide char type,一种用来记录一个宽字符的数据类型
ptrdiff_t即pointer difference type,一种用来记录两个指针之间的距离的数据类型

来自百度百科对size_t的测试举例


int i;							//定义一个int类型的变量i
size_t size = sizeof(i);		//用sizeof操作得到变量i的类型的大小
								//这是一个size_t类型的值
								//可以用来对一个size_t类型的变量做初始化
i = (int)size;					//size_t类型的值可以转化为int类型的值
char c = 'a';					//c保存了字符a,占一个字节
wchar_t wc = L'a';				//wc保存了宽字符a,占两个字节
								//注意'a'表示字符a,L'a'表示宽字符a
int arr[] = { 1, 2, 3, 4, 5 };	//定义一个数组
int *p1 = &arr[0];				//取得数组中元素的地址,赋值给指针
int *p2 = &arr[3];
ptrdiff_t diff = p2 - p1;		//指针的减法可以计算两个指针之间相隔的元素个数
								//所得结果是一个ptrdiff_t类型
i = (int)diff;					//ptrdiff_t类型的值可以转化为int类型的值
有一道陷阱题:
#include<stdio.h>
#include<string.h>
int main()
{
	int flag = -1;
	char* str = "abcde";
	printf("%d\n", strlen(str));
	if (flag > strlen(str))
	{
		printf("-1 > 5");
	}
	else
	{
		printf("-1 < 5");
	}
	return 0;
}

//输出结果
//5
//-1 > 5

为什么会有这么神奇的一个答案呢?编译器出bug了?怎么可能?…
一大堆问号伴随着一长串的羊驼飘过…
其实很简单,strlen()的返回值为size_t类型的无符号整数,而flag为有符号类型整数-1,当有符号整数和无符号整数进行比较时,编译器会自动将有符号整数转化为无符号整数,-1转化为32个1(二进制数,在32位平台下-1为全1,即十进制数4294967295)

C++中的size_t

在C++中,设计 size_t 就是为了适应多个平台的 ,增强程序的可移植性

size_t是针对系统定制的一种数据类型,一般是整型,因为C/C++标准只定义最低的位数,而不是必需的固定位数。而且在内存里,对数的高位对齐存储还是低位对齐存储各系统都不一样。为了提高代码的可移植性,就有必要定义这样的数据类型。一般这种类型都会定义到它具体占几位内存等。
当然,有些是编译器或系统已经给定义好的。在32位系统中size_t是4字节的,而在64位系统中,size_t是8字节的

size_t在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。

扫描二维码关注公众号,回复: 8632642 查看本文章

THE END

发布了67 篇原创文章 · 获赞 15 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_43746320/article/details/102511913