C++ int、long、long int、long long、uint64_t字节长度

news2024/11/23 19:01:41

前言

我们在进行编程时,对于int、long、long long经常使用,但是对于这些类型占用的字节长度可能不会太确定,尤其是在32位平台、64位平台,会有差异,这些知识点为基础知识,容易忽略的基础知识,本文做下分析记录。

不同平台整型字节长度区别

平台/类型charshortintlonglong long
16位12248
32位12448
64位12488

int和short  int


int占用1个机器字长,在32位系统中int占32位,即4个字节,而在16位系统中,int占16位,即2个字节,在c++标准中只限制规定short int不能超过int的长度,具体长度可以由编译器的实现厂商决定,所以目前32位编译器中,
short int占2个字节,int 占4个字节,short int可以简写为short。类似的,c++标准只限制了long int不得小于int的长度,具体长度也没有作出限制。

long 和 long int


我们会看到long 和 long int,其实这两者对于编译器来说时一样的,我们在使用long时,其实已经默认包括了int,同样long long = long long int。
即long是long int的简写,同样的道理 long long是long long int的简写。

int64_t 和 uint64_t

int64_t 和 uint64_t
这两种类型并不是标准的c定义的类型,而是通过typedef重命名的类型,定义在 stdint.h 中:

# if __WORDSIZE == 64
typedef long int		int64_t;
# else
__extension__
typedef long long int		int64_t;
# endif


#if __WORDSIZE == 64
typedef unsigned long int	uint64_t;
#else
__extension__
typedef unsigned long long int	uint64_t;
#endif

从上面的代码也可以看到,如果编译器是64位平台,则uint64_t 其实时unsigned long int,而long int是占用8个字节的。反之,如果编译器是32平台,则uint64_t 是unsigned long long int,也是占用8个字节。

验证

程序如下

#include <stdio.h>
#include <string.h>
#include <stdint.h>

int main(void)
{
    printf("the os is 64 bit.\n");
    
    printf("__WORDSIZE:%d \n", __WORDSIZE);

    printf("char bytes:%d\n", sizeof(char));

    printf("short bytes:%d\n", sizeof(short));

    printf("int bytes:%d\n", sizeof(int));

    printf("float bytes:%d\n", sizeof(float));

    printf("long bytes:%d\n", sizeof(long));
    
    printf("long int bytes:%d\n", sizeof(long int));

    printf("long long bytes:%d\n", sizeof(long long));

    printf("long long int bytes:%d\n", sizeof(long long int));

    printf("uint64_t bytes:%d\n", sizeof(uint64_t));

    printf("uint32_t bytes:%d\n", sizeof(uint32_t));

    printf("size_t bytes:%d\n", sizeof(size_t));
   
    return 0;
}

执行结果如下:

the os is 64 bit.
__WORDSIZE:64 
char bytes:1
short bytes:2
int bytes:4
float bytes:4
long bytes:8
long int bytes:8
long long bytes:8
long long int bytes:8
uint64_t bytes:8
uint32_t bytes:4
size_t bytes:8

初学时候看的文章都是说根据cpu和编译器位数来区分

 但是经过实际测试发现有点问题,使用intel 64位处理器,64位操作系统,vs2017编译器为64位,对int,long,long long三种类型大小进行测试

#include <iostream>
#include <cstring>
#include<cassert>
#include<climits>
using namespace std;

int main()
{
	int *p;
	cout << "int * = " << sizeof(p) << endl;

	cout << "int: "<<sizeof(int) << endl;
	cout << "long int: " << sizeof(long int) << endl;
	cout << "long long int: " << sizeof(long long int) << endl;

}

输出结果

 

通过指针类型可以看出来编译器确实选择的是64位,但是long和int都是4个字节,与上面的图片不符。

后来看c++相关书籍了解到对于long类型不是单纯通过32位或者64位来决定,而是根据编译平台来决定的,具体是在climits这个头文件里,对应c的话是limits.h中的宏定义来决定所占字节
 

#define INT_MIN     (-2147483647 - 1) // minimum (signed) int value
#define INT_MAX       2147483647    // maximum (signed) int value
#define UINT_MAX      0xffffffff    // maximum unsigned int value
#define LONG_MIN    (-2147483647L - 1) // minimum (signed) long value
#define LONG_MAX      2147483647L   // maximum (signed) long value
#define ULONG_MAX     0xffffffffUL  // maximum unsigned long value
#define LLONG_MAX     9223372036854775807i64       // maximum signed long long int value
#define LLONG_MIN   (-9223372036854775807i64 - 1)  // minimum signed long long int value
#define ULLONG_MAX    0xffffffffffffffffui64       // maximum unsigned long long int value

其中MIN和MAX代表取值返回,下划线前面代表类型,U代表无符号,从中可以看到,本平台中int所占为4字节,long也为4个字节,long long为8个字节,不同的编译平台对long的定义可能是不一样的,可以通过这个文件来查看本平台中long定义的大小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/360759.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从0开始写Vue项目-Vue页面主体布局和登录、注册页面

1.从0开始写Vue项目-环境和项目搭建_慕言要努力的博客-CSDN博客 2. 从0开始写Vue项目-Vue2集成Element-ui和后台主体框架搭建_慕言要努力的博客-CSDN博客 一、主体布局 关于主体布局&#xff0c;我们刚开始肯定是做的死数据的&#xff0c;当我们后面整合SpringBoot的时候就会…

JAVA开发(运行JAR包怎么指定虚拟机内存大小)

我们都使用过 java -jar xxx.jar包去运行jar包。但是有时候要指定jar包运行时内存&#xff0c;该怎么做&#xff0c;而且设置多大怎么衡量&#xff0c;很多人从来没有了解过。 背景&#xff1a; 我们开发java程序&#xff0c;可能涉及到开发环境&#xff0c;测试环境&#x…

【C++的OpenCV】第二课-CMake创建OpenCV项目

文章目录一、CMake是什么&#xff1f;1.1 基本概念1.2 CMake的优势二、使用Cmake构建一个OpenCV程序2.1 步骤&#xff08;a&#xff09;编写一个简单的OpenCV示例代码&#xff08;b&#xff09;创建一个Cmake文件&#xff08;c&#xff09;生成可执行文件&#xff08;d&#xf…

初步介绍CUDA中的统一内存

初步介绍CUDA中的统一内存 更多精彩内容: https://www.nvidia.cn/gtc-global/?ncidref-dev-876561 文章目录初步介绍CUDA中的统一内存为此&#xff0c;我向您介绍了统一内存&#xff0c;它可以非常轻松地分配和访问可由系统中任何处理器、CPU 或 GPU 上运行的代码使用的数据。…

存储拆分后,如何解决唯一主键问题?

在单库单表时&#xff0c;业务 ID 可以依赖数据库的自增主键实现&#xff0c;现在我们把存储拆分到了多处&#xff0c;如果还是用数据库的自增主键&#xff0c;就会出现主键重复的情况。 所以我们不得不面对的一个选择&#xff0c;就是ID生成器&#xff0c;使用一个唯一的字符…

c++提高篇——stack容器

一、stack容器的基本概念 stack是一种先进后出(FILO)的数据结构&#xff0c;它只有一个出口。栈中只有顶端的元素才可以被外界使用。因此该容器不能有遍历行为。基本的结构如下&#xff1a; stack容器有些像手枪子弹的弹夹&#xff0c;其数据的出入栈可以以弹夹为参考。 二、…

redis-cluster集群搭建

安装redis所需环境 yum install -y gcc-c yum install -y wget 创建文件夹 cd / mkdir redis/redis-cluster/7001 cd redis/redis-cluster mkdir 7002 7003 7004 7005 7006 7007 7008下载redis压缩包并解压安装 wget https://download.redis.io/redis-stable.tar.gz tar -…

从0开始写Vue项目-SpringBoot整合Mybatis-plus实现登录、注册功能

1.从0开始写Vue项目-环境和项目搭建_慕言要努力的博客-CSDN博客 2. 从0开始写Vue项目-Vue2集成Element-ui和后台主体框架搭建_慕言要努力的博客-CSDN博客 3. 从0开始写Vue项目-Vue页面主体布局和登录、注册页面_慕言要努力的博客-CSDN博客 一、前言 在之前我们以及搭建好了基…

线上问题诊断指南

内容概要 诊断工具介绍工具可用情况偶现或已现问题诊断思路 硬件资源观测 top top可以看整个系统cpu、内存的使用情况&#xff0c;以及在各个进程上的情况&#xff0c;如下&#xff1a; $ top top - 13:14:07 up 2 days, 6:38, 0 users, load average: 1.65, 0.59, 0.27…

知识库:在医疗行业的知识管理有着怎样的意义与实际影响?

知识库中还可存在一个通常被称作典型方法库的特殊部分。如果对于某些问题的解决途径是肯定和必然的&#xff0c;就可以把其作为一部分相当肯定的问题解决途径直接存储在典型方法库中。这种宏观的存储将构成知识库的另一部分。在使用这部分时&#xff0c;机器推理将只限于选用典…

Android 基础知识4-2.10 GridLayout(网格布局)详解

一、GridLayout&#xff08;网格布局&#xff09;概述 GridLayout 布局是 Android 4.0 以后引入的新布局&#xff0c;和 TableLayout(表格布局) 有点类似&#xff0c;不过它功能更多&#xff0c;也更加好用&#xff0c;最大的特点是放置的组件自动占据网格的整个区域,每个组件的…

【Linux】动静态库的制作

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;动静库和静…

RS485通信总线详解

RS485 总线详解 RS-485 是美国电子工业协会&#xff08;EIA&#xff09;在 1983 年批准了一个新的平衡传输标准&#xff08;Balanced Transmission Standard&#xff09;也称作差分&#xff0c;EIA 刚开始将 RS&#xff08;Recommended Standard&#xff09;做为标准的前缀&am…

一文解决Rust字符串:String,str,String,str,CString,CStr

一、str和&str和String的区别 1.存放位置&#xff0c;可变不可变&#xff1a; str来源于Rust本身的数据类型&#xff0c;而String类型来自于标准库。首先看一下str 和 String之间的区别&#xff1a;String是一个可变的、堆上分配的UTF-8的字节缓冲区。而str是一个不可变的…

前端零基础入门-002-集成开发环境

本篇目标 了解市面上常用的前端集成开发环境&#xff08;ide&#xff09;掌握 HBuiberX 的使用&#xff1a;下载安装&#xff0c;新建项目、网页、运行网页。 内容摘要 本篇介绍了市面上流行的几款前端集成开发环境&#xff08;ide&#xff09;&#xff0c;并介绍了 Hbuilde…

华为OD机试 - 按索引范围翻转文章片段(Java) | 机试题算法思路 【2023】

使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12201821.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 按索引范围翻转文章…

【黄啊码】什么是ElasticSearch?它会替代MySQL成为主流吗?如何优化?TP5如何接入ElasticSearch?

什么是ElasticSearch&#xff1f; Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析 引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性&#xff0c;能使数据在生产环境变得更有价值。 Elasticsearch 的实现原理主要分…

「TCG 规范解读」第8章 TPM工作组 TPM 1.2中 SHA1的使用

可信计算组织&#xff08;Ttrusted Computing Group,TCG&#xff09;是一个非盈利的工业标准组织&#xff0c;它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立&#xff0c;并采纳了由可信计算平台联盟&#xff08;the Trusted Computing Platform Alli…

Windows Server 2008 R2安装onlyoffice【docker】

目录 前言 准备工作 安装docker 安装onlyoffice 常见问题 前言 目前docker for windows只能在windows10/11上安装&#xff0c;其他的windows版本只能使用Docker Toolbox来安装&#xff0c;使用该工具安装的docker其实是借助了Oracle VM VirtualBox虚拟机来运行的&a…

简历的专业技能怎么写?排版需要注意的事项

一、简历的专业技能怎么写? 首先,先问一下你自己会什么,然后看看你意向的公司需要什么。一般HR可能并不太懂技术,所以他在筛选简历的时候可能就盯着你专业技能的关键词来看。对于公司有要求而你不会的技能,你可以花几 天时间学习一下,然后在简历上可以写上自己了解这个技…