2010-09-25 95 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整数。