首页 > 编程语言 >125.C++中的size_t

125.C++中的size_t

时间:2023-08-03 19:11:32浏览次数:45  
标签:定义 符号 int 32 C++ 64 125 size

125.C++中的size_t

1.size_t

●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是无符号的,一定要给这种类型的变量赋正数 。

2.size_t 和 int 比较

size_t在32位架构中定义为:typedef unsigned int size_t;
size_t在64位架构中被定义为:typedef unsigned long size_t;
size_t是无符号的,并且是平台无关的,表示0-MAXINT的范围;int为是有符号的;
int在不同架构上都是4字节,size_t在32位和64位架构上分别是4字节和8字节,在不同架构上进行编译时需要注意这个问题。
ssize_t是有符号整型,在32位机器上等同与int,在64位机器上等同与 long int.

参考:C++ size_t

标签:定义,符号,int,32,C++,64,125,size
From: https://www.cnblogs.com/codemagiciant/p/17604215.html

相关文章

  • C++ STL
    1.初始头文件c++标准库不包括.h,#include;c旧库需要包括.h,#include<stdio.h>;c新库在旧库前面加c,不需要包含.h,#include。旧头文件不被封装在std命名空间中。网站资源www.cplusplus.comcppreference.comgcc.gnu.org书籍2.STL体系结构部件六大部件:容器、分配器、......
  • C++ | extern "C" 的用法
    extern"C"是C++中的一种用法(无法在C语言中使用),其作用是修饰一段代码,将其用C语言的方式进行编译。那么,使用C语言方式进行编译与使用C++方式进行编译又有什么区别呢?在C++中,支持函数重载:voidfunc();voidfunc(inta,intb);voidfunc(doublea,floatb);但在C语言中如果......
  • C++基础
    Talkischeap.Showmethecode.C++分为C++语言和C++标准库 版本演化可分为C++98(1.0),C++11(2.0),C++14话不多说,上代码头文件命名方式,例如complex.h首先要写防卫式声明,以前写的时候只是知道要写,现在知道才叫什么。1#ifndef_MYCOMPLEX_2#define_MYCOMPLEX_34......
  • Linux平台C++读写Word文档(DuckX库)
    1、安装cmake如果没有cmake或者cmake版本太旧,都需要进行重新安装此次推荐直接安装编译好的软件包进入官网:https://cmake.org/download/下载后直接在拷贝到系统里进行解压添加环境变量vim/etc/profile添加下面这条命令,路径换成自己安装的路径exportPATH=$PATH:/root......
  • c++
    1,2章输出printf(    输入scanf(一,变量通用形式<类型名><变量名>变量名=标识符(不能用数字开头,不能用关键字/保留字)前缀const【不变的】即锁定变量值(不允许改变)若变量要作为赋值则变量初始时要赋值(初始化) eg:inta; =》inta=0;二,浮点数类型名:int整点   do......
  • 遵守 MISRA 如何提高C++应用的安全性
    Perforce在支持需要稳定和安全的应用程序方面有着悠久的历史。凭借50多年的应用程序开发经验,从客户、趋势和竞争对手那里学到了很多东西。Perforce从软件开发的所有领域都采用了最佳实践,并试图将这些实践应用于Perforce所做的一切。Perforce采用了单元测试、自动化测试、敏捷开......
  • C/C++ 数据结构五大核心算法之动态规划算法-给你一根长度为 n 的金条,请把金条剪成 m
    动态规划也是一种分治思想,但与分治算法不同的是,分治算法是把原问题分解为若干子问题,自顶向下,求解各子问题,合并子问题的解从而得到原问题的解。动态规划也是自顶向下把原问题分解为若干子问题,不同的是,然后自底向上,先求解最小的子问题,把结果存储在表格中,在求解大的子问题时,直接从表......
  • 常用c++ STL 汇总
    常用STL:vector变长数组,倍增的思想初始化://初始化vector<int>a;vector<int>a(n);vector<int>a[n];vector<int>a(n,0);//长度为n,值为0操作:size()//返回元素个数empty()//返回是否为空clear()//清空front()/back()//返回第一个/最后一个元素push_bac......
  • C++11可变模版参数妙用
    //参考:https://blog.csdn.net/wmy19890322/article/details/121427697点击查看代码//创建对象template<typenameT,typename...Args>T*CreateInstance(Args...args){ returnnewT(std::forward<Args>(args)...);}//可变参数模版实现泛化的delegatetemplate<typena......
  • C++入门到放弃(07)——构造函数和析构函数
    ​1.构造函数和析构函数是什么1.1构造函数通常一个类,其内部包含有变量和函数,当我们想要使用类的时候,总是会不得不面临这样一个问题,需要对类进行初始化,否则内部这些变量就会是随机值,导致程序出现异常。为此,我们需要在使用类之前对它进行初始化,C++就提供了这样一类特殊的函数——......