1. 程式人生 > >如何理解atoi、atol、strtol在32位系統64位系統上的區別

如何理解atoi、atol、strtol在32位系統64位系統上的區別



工作中遇到的一個問題,分析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 手冊分析,通過實際的測試找到答案,不要盲目的查百度這樣能夠加深記憶與理解。

相關推薦

如何理解atoiatolstrtol在32系統64系統區別

 工作中遇到的一個問題,分析uint uiIndex = atoi(aucNum)是否存在問題; 這就要分析atoi轉換後可能出現什麼值,以及執行在32位系統與64位系統是否會有區別。 通過man atoi函數了解到atoi函式實際呼叫的strtol函式。 即函式在轉換

stof()atoi()atol()strtod()strtol()strtoul() 共6個可以將字串轉換為數字的函式

標頭檔案:#include <stdlib.h> atoi() 函式用來將字串轉換成整數(int),其原型為: int atoi (const char * str); 【函式說明】atoi() 函式會掃描引數 str 字串,跳過前面的空白字元(例如空格,tab縮排等,可以通過 

各種資料型別在163264系統下所佔位元組差異簡介

編寫C、C++程式時需要考慮每種資料型別在記憶體中所佔的記憶體大小,即使同一種資料型別在不同平臺下所佔記憶體大小亦不相同,具體對比如下: 資料型別 16位系統(byte) 32位系統(by

sizeof和strlen3264系統各型別的長度

sizeof:申請了多少記憶體空間或者,例如char a[20],sizeof(a)=20。若為char a[],他的大小應該為使用了多少大小就為多少。 strlen計算字元陣列的長度時,是以找到0或者\0作為終止。若末尾沒有0或者\0作為結束,則不會計算出正確的字元陣

蘋果產品時間發布表統計(iPhoneiPad),以及3264機的說明

bsp 產品 13.10 上市 pos min ipad mini 時間排序 手機 之前因為某些原因,需要對apple家族的手機和pad產品做一個上市時間排序,以及分析分別是哪種CPU機型 總結如下: iPad家族: 1、iPad     - 2010.1.27發布 2、

【原始碼】宣告3264AccessExcel等VBA相容的API函式的方法

1.在宣告中加上  PtrSafe 關鍵字2.加上VBA7 及Win64的判斷 Declare 語句 PtrSafe 關鍵字(可參考VBA幫助)帶有 PtrSafe 關鍵字的 Declare 語句為建議的語法。要使包括 PtrSafe 的 Declare 語句能同時在 32 位和

3264 CPU編譯器作業系統應用程式arm和X86關係

一:arm和X86的區別 arm:對應精簡指令集 X86:對應複雜指令集 arm上的和X86上編譯過的的東西是不能相互使用的,因為指令集不一樣嘛。指令集可以通俗的理解為,溝通語言。arm和X86之間東西不能直接用,類似於一個美國人和一箇中國人各自只說自己的語言,那麼這兩個人是沒法溝通的。

Dumpbin檢視libdll檔案是32還是64

32bit DLL C:\Program Files (x86)\Java50\jre\bin\j9vm> dumpbin /headers jvm.dll </span> Mi

關於程式碼中區分debug與release3264xp還是win7編譯的巨集定義

在寫程式碼的過程中,我們經常需要考慮這樣的一些問題:有一部分程式碼片段只有在32位編譯環境下編譯才能通過,在64位編譯環境下是無法編譯通過的,那麼怎樣才能判斷當前編譯環境是32位編譯還是64位編譯?還有,如何判斷當前編譯是debug編譯還是release編譯?再者,有些AP

判斷機器程式是32還是64

一、Linux上如何知道自己的作業系統/計算機 是32位還是 64位的?Linux users should type the uname command. Depending on the platform, you may seeuname -a Linux gayl

NodeJSNPM安裝配置步驟(windows7 64)

2、安裝過程基本直接“NEXT”就可以了。(windows的安裝msi檔案在過程中會直接新增path的系統變數,變數值是你的安裝路徑,例如“C:\Program Files\nodejs”)。 3、安裝完成後可以使用cmd(win+r然後輸入cmd進入)測試下是否安裝成功。方法:在cmd下輸入node

Linux系統查看系統是32還是64方法總結 in 創新實訓

-a 如果 rep 分享 查看 blog cpu 整理 ble 這篇博客是總結、歸納查看Linux系統是32位還是64位的一些方法,很多內容來自網上網友的博客。本篇只是整理、梳理這方面的知識,方便自己忘記的時候隨時查看。 方法1:getconf LONG_BIT 查看 如下

一個偉大的發現,裝X一下。筆記本win7系統64機器執行unity 時,屏幕模糊解決的方法

-a dsm directx ctx font 偉大的 size pop 系統 筆者筆記本win7系統64位機器執行unity 時。往往切換時unity界面屏幕模糊,後來發現此時須要下載DirectXRuntimes201006x64,安裝就可以。 一

3264系統,到底哪個好?

操作系統 32位系統 64位系統 今天這是個純理論分享了,32位和64位系統有什麽區別?我們到底用哪個好?這個問題在xp時代都不存在,vista系統不談,從win7開始,才出現在我們面前,讓我們抉擇。相信好多人不懂或有些誤區,更甚至有部分自稱為【專家】的人告訴你用32位的,用64位的系統好多軟件都

c#判斷操作系統是32還是64

ping interop 64位 lin last 直接 run 遇到 roc 做一個c#項目時,遇到要獲取操作系統位數的問題,在網上找了幾個小時,都沒有找到比較完整的解決方案。話不多說,直接上可以運行的代碼(簡單、粗暴) using System.Runtime.Con

3264系統區別

blank 內存 jce com 解釋 理論 light 一次 body 系統32位和64位官方解釋 32位和64位操作系統是指:CPU一次處理數據的能力是32位還是64位。現在市場上的CPU一般都是64位的,但是這些CPU並不是真正意義上的64 位CPU,裏面依然保留了大

Linux系統是32還是64查看方法總結

x86_64 如果 9.png 支持 ges mod lag span long 【聲明】 本文版權歸原作者所有,歡迎轉載,轉載請註明出處。 原作者:瀟湘隱者 出處:http://www.cnblogs.com/kerrycode/ 原文鏈接:https://www.cn

32/64系統,jdk3264,32/64jdk編譯出來的class和eclipse 3264

首先關於32位/64位系統,jdk32位,64位,32/64位jdk編譯出來的class和eclipse 32位和64位的一些對應關係做些說明。 1.32位作業系統不可以裝64位jdk,64位作業系統一般都可以安裝32位jdk,64位jdk是完美髮揮效能的。 2.64位eclipse只能在6

3264系統區別及int位元組數

一、64位系統和32位有什麼區別? 1、64bit CPU擁有更大的定址能力,最大支援到16GB記憶體,而32bit只支援4G記憶體 2、64位CPU一次可提取64位資料,比32位提高了一倍,理論上效能會提升1倍。但這是建立在64bit作業系統,64bit軟體的基礎上的。 什麼是64位處理器? 之所以叫

【問題】檢視當前系統是32還是64

方法1 uname -i 方法2 getconf LONG_BIT 方法3 CentOS 6.X及低版本    file /sbin/init CentOS 7.X    file /lib/systemd/systemd