2010-09-25 42 views
4

我想將字符串轉換爲帶符號的int。以下是要求。我已將十六進制值作爲字符串存儲在緩衝區中。現在我想將該值轉換爲signed int。將字符串轉換爲帶符號的int

buf = "fb869e"將其轉換爲signed int。所以o/p應該是-293218。但是當我試圖使用strtol轉換時,我得到了16483998.那麼,我該怎麼做?

+0

哪種語言? – codaddict 2010-09-25 05:28:27

+0

編程語言? – 2010-09-25 05:29:48

+0

你從哪裏得到0xfb869e是-293218?斯托爾其實是對的。 – vanza 2010-09-25 05:34:26

回答

0
0xfb869e == 0x00fb869e == 16483998 

作爲一個有符號的整數,高位必須設置爲產生一個負數。由於給定數字的高位沒有設置,它必須是正數。

如果你想把這個數字當作一個24位的數字來處理,那麼你必須把第23位填充到其餘的高位。這裏有一個辦法做到這一點:

long n = strtol(...); 
if (n > 0xffffff) n |= 0xff000000; 
+0

char buf =「fb869e」 - 我想轉換爲signed int。 o/p應該是-293218。我只是試圖將字符串轉換爲長整型。但我沒有得到負面價值。 – ulaganathan 2010-09-25 05:51:28

+0

char buf =「fb869e」。我想將其轉換爲signed int。所以o/p應該是-293218。我只是嘗試使用strtol將字符串轉換爲long。但我沒有得到負面的價值。我的十六進制值如下。我需要o/p在signed int中。 「C程序設計」 80000e fcc15e 7ffffe 0b778e 80000e ee4dae 7ffffe 1b1e5e 80000e de2b9e 7ffffe 2b8c4e 80000e ce2e1e 7ffffe – ulaganathan 2010-09-25 05:58:58

+0

@ulganathan:有在我的答案中的錯誤。改用'if(n> 0x7fffff)...'代替。 – 2010-09-25 06:38:47

0

爲什麼要0x00fb869e是負數?你應該提供你的電話號碼系統的基礎上,甚至被允許講,在一個格式的值是否爲另一種格式

+0

char buf =「fb869e」。我想將其轉換爲signed int。所以o/p應該是-293218。我的十六進制值如下。我需要o/p在signed int中。 80000e fcc15e 7ffffe 0b778e 80000e ee4dae 7ffffe 1b1e5e 80000e de2b9e 7ffffe 2b8c4e 80000e ce2e1e 7ffffe – ulaganathan 2010-09-25 05:57:53

4

負的十六進制數0xfb869e負。內置數字轉換函數不會將其轉換爲負值,因爲它的值是正值。

你在說的是,這是一個24位二進制補碼負數的無符號十六進制等價物,並且你需要這個數字。獲得該方法是將其轉換爲正數,然後用計算將其轉換爲24位二進制補碼相當於:

char *buf = "fb869e"; 
long n; 

n = strtol(buf, NULL, 16); 
if (n > 0x7fffffL) 
    n -= 0x1000000L; 
+0

非常感謝....這事搞砸了我要過去3小時...再次感謝您的幫助.... – ulaganathan 2010-09-25 07:02:04

1

也有人建議strtol()。我只想提sscanf()作爲替代,如:

int i; 
char *buf = "fb869e"; 
if (sscanf(buf, "%x", &i) == 1) 
    ... 
+0

感謝您的回覆...... – ulaganathan 2010-09-25 10:38:30

0

使用strtol它轉換stringlong整數。