常用数据类型在32位和64位CPU上的字节数比较

2024-01-09 08:18

本文主要是介绍常用数据类型在32位和64位CPU上的字节数比较,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

测试语句(C语言):
printf("char[%d] char*[%d] s_int[%d] int[%d] u_int[%d] float[%d] double[%d] long[%d] LL[%d] UL[%d]/n",
sizeof(char),sizeof(char *),
sizeof(short int),sizeof(int),sizeof(unsigned int),
sizeof(float),sizeof(double),
sizeof(long),sizeof(long long),sizeof(unsigned long));
结果如下:
CPU类型 输出结果
ia64    char[1]  char*[8] s_int[2] int[4] u_int[4] float[4] double[8]  long[8] LL[8]  UL[8]
x86_64 char[1]  char*[8] s_int[2] int[4] u_int[4] float[4] double[8]  long[8] LL[8]  UL[8]
i686   char[1]  char*[4] s_int[2] int[4] u_int[4] float[4] double[8]  long[4] LL[8]  UL[4]
很明显的比较结果,指针和长整型由4个升为8个字节,可能在做系统移植的时候需要注意。
作者:天之骄子 tags: 64  C C++  C/C++

在C/C++中,64为整型一直是一种没有确定规范的数据类型。现今主流的编译器中,对64为整型的支持也是标准不一,形态各异。一般来说,64位整型的定义方式有long long和__int64两种(VC还支持_int64),而输出到标准输出方式有printf(“%lld”,a),printf(“%I64d”,a),和cout << a三种方式。

本文讨论的是五种常用的C/C++编译器对64位整型的支持,这五种编译器分别是gcc(mingw32),g++(mingw32),gcc(linux i386),g++(linux i386),Microsoft Visual C++ 6.0。可惜的是,没有一种定义和输出方式组合,同时兼容这五种编译器。为彻底弄清不同编译器对64位整型,我写了程序对它们进行了评测,结果如下表。

变量定义输出方式gcc(mingw32)g++(mingw32)gcc(linux i386)g++(linux i386)MicrosoftVisual C++ 6.0
long long“%lld”错误错误正确正确无法编译
long long“%I64d”正确正确错误错误无法编译
__int64“lld”错误错误无法编译无法编译错误
__int64“%I64d”正确正确无法编译无法编译正确
long longcout非C++正确非C++正确无法编译
__int64cout非C++正确非C++无法编译无法编译
long longprintint64()正确正确正确正确无法编译

上表中,正确指编译通过,运行完全正确;错误指编译虽然通过,但运行结果有误;无法编译指编译器根本不能编译完成。观察上表,我们可以发现以下几点:

  1. long long定义方式可以用于gcc/g++,不受平台限制,但不能用于VC6.0。
  2. __int64是Win32平台编译器64位长整型的定义方式,不能用于Linux。
  3. “%lld”用于Linux i386平台编译器,”%I64d”用于Win32平台编译器。
  4. cout只能用于C++编译,在VC6.0中,cout不支持64位长整型。

表中最后一行输出方式中的printint64()是我自己写的一个函数,可以看出,它的兼容性要好于其他所有的输出方式,它是一段这样的代码:

?[Copy to clipboard] View Code CPP
[cpp]  view plain copy
  1. <span style="color: #0000ff;">void</span> printint64<span style="color: #008000;">(</span><span style="color: #0000ff;">long</span> <span style="color: #0000ff;">long</span> a<span style="color: #008000;">)</span>  
  2.             <span style="color: #008000;">{</span>  
  3.             <span style="color: #0000ff;">if</span> <span style="color: #008000;">(</span>a<span style="color: #000080;"><=</span>100000000<span style="color: #008000;">)</span>  
  4.             <span style="color: #0000dd;">printf</span><span style="color: #008000;">(</span><span style="color: #ff0000;">"%d<span style="font-weight: bold; color: #000099;">/n</span>"</span>,a<span style="color: #008000;">)</span><span style="color: #008080;">;</span>  
  5.             <span style="color: #0000ff;">else</span>  
  6.             <span style="color: #008000;">{</span>  
  7.             <span style="color: #0000dd;">printf</span><span style="color: #008000;">(</span><span style="color: #ff0000;">"%d"</span>,a<span style="color: #000040;">/</span>100000000<span style="color: #008000;">)</span><span style="color: #008080;">;</span>  
  8.             <span style="color: #0000dd;">printf</span><span style="color: #008000;">(</span><span style="color: #ff0000;">"%08d<span style="font-weight: bold; color: #000099;">/n</span>"</span>,a<span style="color: #000040;">%</span>100000000<span style="color: #008000;">)</span><span style="color: #008080;">;</span>  
  9.             <span style="color: #008000;">}</span>  
  10.             <span style="color: #008000;">}</span>  

这种写法的本质是把较大的64位整型拆分为两个32位整型,然后依次输出,低位的部分要补0。看似很笨的写法,效果如何?我把它和cout输出方式做了比较,因为它和cout都是C++支持跨平台的。首先printint64()和cout(不清空缓冲区)的运行结果是完全相同的,不会出现错误。我的试验是分别用两者输出1000000个随机数,实际结果是,printint64()在1.5s内跑完了程序,而cout需要2s。cout要稍慢一些,所以在输出大量数据时,要尽量避免使用。

这篇关于常用数据类型在32位和64位CPU上的字节数比较的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/586472

相关文章

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

golang中reflect包的常用方法

《golang中reflect包的常用方法》Go反射reflect包提供类型和值方法,用于获取类型信息、访问字段、调用方法等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录reflect包方法总结类型 (Type) 方法值 (Value) 方法reflect包方法总结

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

python常用的正则表达式及作用

《python常用的正则表达式及作用》正则表达式是处理字符串的强大工具,Python通过re模块提供正则表达式支持,本文给大家介绍python常用的正则表达式及作用详解,感兴趣的朋友跟随小编一起看看吧... 目录python常用正则表达式及作用基本匹配模式常用正则表达式示例常用量词边界匹配分组和捕获常用re

Python变量与数据类型全解析(最新整理)

《Python变量与数据类型全解析(最新整理)》文章介绍Python变量作为数据载体,命名需遵循字母数字下划线规则,不可数字开头,大小写敏感,避免关键字,本文给大家介绍Python变量与数据类型全解析... 目录1、变量变量命名规范python数据类型1、基本数据类型数值类型(Number):布尔类型(bo

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

conda安装GPU版pytorch默认却是cpu版本

《conda安装GPU版pytorch默认却是cpu版本》本文主要介绍了遇到Conda安装PyTorchGPU版本却默认安装CPU的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、问题描述二、网上解决方案罗列【此节为反面方案罗列!!!】三、发现的根本原因[独家]3.1 p