如何理解atoi、atol、strtol在32位系统64位系统上的区别

C/C++指针与内存操作全解析:从基础到实战,掌握字符串转换与智能指针 指针是C/C++编程中的核心概念,本质上是存储内存地址的变量,它提供了直接访问和操作内存的能力。理解指针的工作原理,是掌握内存管理、数据结构和底层系统编程的基础。指针技术通过地址运算和间接访问,实现了高效的数据处理与灵活的程序设计,在操作系统、嵌入式开发、高性能计算等场景中不可或缺。本文聚焦于指针与字符串操作的深度结合,针对`atoi`、`strtol`等字符串转换函数,剖析其背后的内存遍历与边界管理逻辑,并延伸探讨了智能指针如何自动化内存管理,旨在帮助开发者规避内存泄漏和段错误等常见陷阱,提升代码的安全性 阅读详情


工作中遇到的一个问题,分析uint uiIndex = atoi(aucNum)是否存在问题;
这就要分析atoi转换后可能出现什么值,以及运行在32位系统与64位系统是否会有区别。

通过man atoi函数了解到atoi函数实际调用的strtol函数。

即函数在转换过程中存储的值都是long型的值,即返回long型后强制转换成int型。
此时就要分析long型所能表示的范围了。
long型32位下与int型相同,即转换后的结果与int型结果的范围一致即2147483647~-2147483648,如果入参超过这个的范围则返回这个值的边界值,正数返回2147483647负数返回-2147483648
long型64位下占8个字节,所以此时能够存储的最大返回就是
9223372036854775807~-9223372036854775808,所以即使超过int型的最大长度,也能存储,此时就会直接进行long型到int型的强制转换,发生截断,舍弃高32bit的数据,而不保留符号位(符号位是最高bit)
如转换后是0x7fffffffffffffff,是一个正数,截断后就变成 0xffffffff = -1

strtol函数能够指定入参的类型是0-36进制的数,即如果入参是十六进制的字符串可以用此函数转换。
strtoll 返回结果是longlong型
strtoul如果入参字符串的范围是一个ulong范围的值,则可以使用此函数转换。转换结果范围为0~0xffffffff (32bit)或0~0xffffffffffffffff(64bit)
所以在编程时一定要区分好32位和64位系统,且要保证字符串的实际范围与所调用的函数能表示的范围一致,否则出现截断的话,则可能出现非预期的结果。

总结:工作中如果遇到不明白如何使用的时候,首先要通过man 手册分析,通过实际的测试找到答案,不要盲目的查百度这样能够加深记忆与理解。

C语言进制转换实战:从内存视角掌握底层编程核心技能 进制转换是计算机科学的基础概念,它定义了数字在不同计数系统(如二进制、十进制、十六进制)中的表示方法。其核心原理在于“逢N进一”的数学规则,以及二进制与计算机硬件(晶体管开关)的直接对应关系。掌握进制转换的技术价值在于,它使程序员能够直接理解和操作内存中的二进制数据,这是进行系统编程、硬件交互和性能优化的关键。在应用场景上,无论是调试内存数据、解析网络协议包,还是配置硬件寄存器,对进制的深刻理解都能极大提升效率。本文聚焦于C语言中的进制转换实战,深入探讨了`printf`/`scanf`的格式化技巧、`st 阅读详情

相关推荐

Scipy优化踩坑实录:trust-constr和SLSQP约束定义到底差在哪?

本文深入解析了Scipy优化模块中trust-constr和SLSQP两种方法在约束定义上的差异。通过对比面向对象的trust-constr和字典式定义的SLSQP,揭示了它们各自的优势与适用场景,帮助开发者在有约束优化问题中选择合适的算法,提升计算效率与准确性。

weixin_42573113的博客 270

关于atoi和atol转换超过10位数字字符串溢出问题

一、问题 atoi( const char *str )和atol(const char *str )转换超过10位的字符串,转换失败 二、分析 atoi函数返回的int取值范围:-2147483648 ~ 2147483647 atol函数返回的long int取值范围:-2147483648 ~ 2147483647 10位数超过int和long int的取值范围 三、解决 使用函数_atoi64函数替换 原型:_int64 _atoi64(const char *_String) ..

Jonton_Lee的博客 3571

单细胞数据互转实战:从Scanpy的h5ad到Seurat对象的四种高效方法

本文针对单细胞数据分析中Scanpy的h5ad格式与Seurat对象互转的常见难题,详细对比了SeuratDisk、anndataR、schard和sceasy四种高效转换方法。文章从实战出发,剖析了每种方法的原理、操作流程、优缺点及避坑指南,并提供了清晰的选型策略,帮助用户根据数据特点选择最佳方案,实现跨平台数据的无缝衔接。

weixin_29099217的博客 446

64位 atol c linux_如何理解atoi、atol、strtol在32位系统64位系统上的区别

工作中遇到的一个问题,分析uint uiIndex = atoi(aucNum)是否存在问题;这就要分析atoi转换后可能出现什么值,以及运行在32位系统与64位系统是否会有区别。通过man atoi函数了解到atoi函数实际调用的strtol函数。即函数在转换过程中存储的值都是long型的值,即返回long型后强制转换成int型。此时就要分析long型所能表示的范围了。long型32位下与i...

weixin_36127981的博客 930

《BiLSTM with Multi-Polarity Orthogonal Attention for Implicit Sentiment Analysis》论文阅读笔记

文章名:《BiLSTM with Multi-Polarity Orthogonal Attention for Implicit Sentiment Analysis》 作者Jiyao Wei a,1, Jian Liaoa,1, Zhenfei Yanga, Suge Wanga,b,∗, Qiang Zhaoa 年份 2019 1 Introduction 目前文本情感分析多分析带...

weixin_39036944的博客 1630

64位 atol c linux_Linux C之atoi()函数

1.首先man下ATOI(3) Linux Programmer's Manual ATOI(3)NAMEatoi, atol,atoll, atoq - convert a string to an integerSYNOPSIS#include int atoi(const char *nptr);long atol(const char *np...

weixin_30212109的博客 462

Duilib的简单使用(五、DuiDesigner/DuiEditor的下载编译)

一、前言 在Duilib的简单使用(一、duilib demo)中我们介绍了利用duilib简单的构造一个项目 在Duilib的简单使用(二、xml实现界面与业务分离)中我们介绍了XML在duilib中的使用 在Duilib的简单使用(三、界面逻辑交互)中我们已经知道如何简单的进行界面的交互 在Duilib的简单使用(四、换肤)中,我们提了一下Duilib强大的一键换肤功能。 通过之前的说明,我们知道duilib是通过xml来分离界面和业务逻辑的,但是xml如果不能预览,那每次敲一个再运行一下看看效果,这不

LyRics1996的博客 2888

C++强制类型转换与字符类型之间的转换

在C语言中,强制类型转换的方式为(Type)Expression,另外还有一种现在已经不用的旧式写法Type(Expression),这两种方式是等价的。 但是,C语言的强制类型转换方式存在一些问题: 过于粗暴,可以在任意类型之间进行转换,编译器很难判断其正确性 难于定位,在源代码中无法快速定位所有使用强制类型转换的语句 然而,强制类型转换在实际工程中几乎是不可避免的,为此C++将强制类型转换分为4种不同的类型,以提供更加安全可靠的转换。 强制类型转换 说 明 static_cast

qq_34911636的博客 6142

从技术债红线到系统治理:透视 SAP Clean Core 中的 Level D

SAP推出的Clean Core分级体系将扩展风险划分为A到D四个等级,其中Level D代表最高风险类别,涉及直接修改标准代码、隐式增强、使用noAPI对象等不被推荐的做法。这些做法虽然短期见效快,但会带来升级冲突、数据完整性风险等长期问题。SAP强调治理重点不是完全消除经典ABAP,而是优先清理Level D对象,逐步向稳定接口迁移。典型案例显示,依赖内部细节的扩展往往在系统升级或云迁移时集中暴露出问题。企业应通过工具链持续监控Level D占比,将其纳入技术债管理范畴。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1063

蓝牙配对鉴权过程深度剖析:Just Works/Numeric Comparison/Passkey Entry/OOB 协议流程

当你新买的智能手表与手机配对时,是否遇到过这样的情况:有时只需在手机上点击 "确认" 即可完成配对,有时却需要在手表上输入手机显示的 6 位数字,而连接车载蓝牙时可能又需要输入固定密码?这些差异背后,是蓝牙配对鉴权机制在默默工作。蓝牙配对鉴权是设备间建立安全连接的核心环节,直接关系到数据传输的保密性和设备身份的真实性。​

byte轻骑兵的技术小窝 3571

atoi函数的实现(字符串转32位整数)两大巨坑

文章目录关于aoti函数:代码实现: 关于aoti函数: 读入字符串并丢弃无用的前导空格 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。 将前面步骤读入的这些数字转换为整数(即,“123” -> 123, “0032” -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。 如果整数数超过

CppYyds的博客 1230

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

64位 atol c linux_Linux_C函数参考

1、isalnum 测试字符是否为英文或数字相关函数:isalpha,isdigit,islower,isupper2、isalpha 测试字符是否为英文字母 相关函数:isalnum,islower,isupper3、isascii 测试字符是否为ASCII码字符相关函数:iscntrl4、iscntrl 测试字符是否为ASCII码的控制字符 相关函数:isascii5、isdigit ...

weixin_42097967的博客 365

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Linux __int64 与 _atoi64()的替换函数

一、__int64 Windows下有__int64【注意,int64前是两个下划线】,但是在Linux下不存在__int64,为了方便使用,可以自定义__int64的宏 #define __int64 long long ,__int64对应 long long 二、_atoi64() Windows下有_atoi64()函数,但是在Linux下不存在_atoi64()函数,为了方便使...

qq_27278957的博客 7214

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

LEETCODE 8. 字符串转换整数 (atoi)(中等)

文章目录一、题目二、思路1.特殊情况三、代码总结 字符串处理问题。 一、题目 请你来实现一个 atoi 函数,使其能将字符串转换成整数。 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下: 如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。 假如第一个非空字符是数字,则直接与之后连续的数字字符组合起来,形成一个整数。 该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们

weixin_44726627的博客 354

CAPL_学习笔记(Itoa/_atoi64)

变量不一定只能是long类型,因为隐式转换机制(即,实参传递形参时,数据类型优先转换为形参类型),使用byte,word,dword,int arr[2](数组中的具体元素),甚至可以是ASCIL编码的字符变量或字符常量均可。3:最后是转换进制的形参,可以是变量可以是常数,(但是不管是常量还是变量),该参数只支持2进制,8进制,10进制,16进制,其他参数运行时会报错。第一行中 1 标注处 可以知道该函数,是没有返回值的,包含了三个参数,看6处,详细标注了,每个参数的含义。,先看描述,提取出几个关键词,

WE_BIG的博客 1334

atoi函数的介绍和模拟实现

还不进来,atoi函数的介绍和模拟实现,认真看完,包你进步。

GD_small_bit的博客 702

64位 atol c linux_C 库函数

C 库函数 - atol()描述C 库函数 long int atol(const char *str) 把参数 str 所指向的字符串转换为一个长整数(类型为 long int 型)。声明下面是 atol() 函数的声明。long int atol(const char *str)参数str -- 要转换为长整数的字符串。返回值该函数返回转换后的长整数,如果没有执行有效的转换,则返回零。实例下面...

weixin_28882363的博客 202

【C语言】atoi函数的模拟实现

atoi函数的使用和模拟实现,结尾附有完整源代码

铭哥不写bug的博客 1127

atoi(),atol(),在linux系统中使用

atoi(),atol(),取值在2147483647,返回2147483637;0~2147483647,返回0~2147483647;atol(),atoi(),取值0,返回0~4294967296;

qwangq的专栏 258

使用atoi要小心

用atoi来将字符串转换为int类型。 例如atoi("12345")返回整数12345。 当期望转换的类型是uint32_t的时候,有些兄弟可能会这么写:(uint32_t)atoi("3000000000"),这在64位机器上运行是正确的,返回整数30亿;但是当迁移到32位机器上时,就出错了,只能返回2147483647,即0x7FFFFFFF。 这是因为atoi内部使用

〓☆〓 清风徐来918 (QQ:89617663) 6513

64位 atol c linux_Linux下c++中的atoi、atol、atoll、atof函数调用实例

本文中调用的四个函数如下:atoi函数:将字符串转化为int类型变量atol函数:将字符串转化为long类型变量atoll函数:将字符串转化为long long类型变量atof函数:将字符串转化为double类型变量这些函数的转化过程,都是将一个字符串的可读部分取到变量中遇到不可读的部分,则直接终止读取调用示例:#include #include #define Seperate(); print...

weixin_39867559的博客 866

64位linux atoi,inet_ntoa(remote_addr.sin_addr) 在64位linux下core dump

int socket_server(){int sockfd,client_fd; /*sock_fd:监听socket;client_fd:数据传输socket */struct sockaddr_in my_addr; /*本机地址信息*/struct sockaddr_in remote_addr; /*客户端地址信息*/int sin_size;charrecv_buf[MAX_BUF_S...

weixin_31955925的博客 206

Leetcode刷题之字符串转整数

目录 1、题目 2、思路 3、代码 4、结果 1、题目 请你来实现一个myAtoi(string s)函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的atoi函数)。 函数myAtoi(string s)的算法如下: 读入字符串并丢弃无用的前导空格 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。...

weixin_41803339的博客 271
上一篇: 移位操作,宏定义
下一篇: ubuntu16.04 安装有道词典
LY_ulysses
博客等级 码龄16年 12粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值