如何理解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 手冊分析,通過實際的測試找到答案,不要盲目的查百度這樣能夠加深記憶與理解。
相關推薦
如何理解atoi、atol、strtol在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縮排等,可以通過 
各種資料型別在16位、32位和64位系統下所佔位元組差異簡介
編寫C、C++程式時需要考慮每種資料型別在記憶體中所佔的記憶體大小,即使同一種資料型別在不同平臺下所佔記憶體大小亦不相同,具體對比如下: 資料型別 16位系統(byte) 32位系統(by
sizeof和strlen、32位和64位系統各型別的長度
sizeof:申請了多少記憶體空間或者,例如char a[20],sizeof(a)=20。若為char a[],他的大小應該為使用了多少大小就為多少。 strlen計算字元陣列的長度時,是以找到0或者\0作為終止。若末尾沒有0或者\0作為結束,則不會計算出正確的字元陣
蘋果產品時間發布表統計(iPhone、iPad),以及32位和64位機的說明
bsp 產品 13.10 上市 pos min ipad mini 時間排序 手機 之前因為某些原因,需要對apple家族的手機和pad產品做一個上市時間排序,以及分析分別是哪種CPU機型 總結如下: iPad家族: 1、iPad - 2010.1.27發布 2、
【原始碼】宣告32位和64位Access、Excel等VBA相容的API函式的方法
1.在宣告中加上 PtrSafe 關鍵字2.加上VBA7 及Win64的判斷 Declare 語句 PtrSafe 關鍵字(可參考VBA幫助)帶有 PtrSafe 關鍵字的 Declare 語句為建議的語法。要使包括 PtrSafe 的 Declare 語句能同時在 32 位和
32位與64位 CPU、編譯器、作業系統、應用程式、arm和X86關係
一:arm和X86的區別 arm:對應精簡指令集 X86:對應複雜指令集 arm上的和X86上編譯過的的東西是不能相互使用的,因為指令集不一樣嘛。指令集可以通俗的理解為,溝通語言。arm和X86之間東西不能直接用,類似於一個美國人和一箇中國人各自只說自己的語言,那麼這兩個人是沒法溝通的。
Dumpbin檢視lib、dll檔案是32位還是64位
32bit DLL C:\Program Files (x86)\Java50\jre\bin\j9vm> dumpbin /headers jvm.dll </span> Mi
關於程式碼中區分debug與release、32位與64位、xp還是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
NodeJS、NPM安裝配置步驟(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,安裝就可以。 一
32位和64位系統,到底哪個好?
操作系統 32位系統 64位系統 今天這是個純理論分享了,32位和64位系統有什麽區別?我們到底用哪個好?這個問題在xp時代都不存在,vista系統不談,從win7開始,才出現在我們面前,讓我們抉擇。相信好多人不懂或有些誤區,更甚至有部分自稱為【專家】的人告訴你用32位的,用64位的系統好多軟件都
c#判斷操作系統是32位還是64位
ping interop 64位 lin last 直接 run 遇到 roc 做一個c#項目時,遇到要獲取操作系統位數的問題,在網上找了幾個小時,都沒有找到比較完整的解決方案。話不多說,直接上可以運行的代碼(簡單、粗暴) using System.Runtime.Con
32位和64位系統的區別
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位系統,jdk32位,64位,32/64位jdk編譯出來的class和eclipse 32位和64位
首先關於32位/64位系統,jdk32位,64位,32/64位jdk編譯出來的class和eclipse 32位和64位的一些對應關係做些說明。 1.32位作業系統不可以裝64位jdk,64位作業系統一般都可以安裝32位jdk,64位jdk是完美髮揮效能的。 2.64位eclipse只能在6
32位和64位系統區別及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