C++中将无符号字符转换为整数

16

我有一个变量unsigned char,其中包含一个值,例如40。 我想要一个int变量来获取该值。 最简单和最有效的方法是什么? 非常感谢。


2
无符号字符实质上是计算机解释为整数的一字节内存,范围从0到255。整数类型通常为4个字节,范围为-2147483648到2147483647。转换通常涉及从一个值分配到另一个值。无符号字符到整数的赋值没有问题,但反过来会在高端产生溢出问题。将负数转换为无符号字符也没有意义。 - Kemin Zhou
6个回答

20
unsigned char c = 40;
int i = c;

假设你的问题不止于此...


如果我写printf("c: %x", c),我得到的是32。然后我写int i = c,当我打印“i”时,我得到50! - user1346664
8
"%x" 以十六进制形式输出。32个十六进制等于50个十进制。请使用"%d"代替。 - Oliver Charlesworth

7

你可以尝试以下方法,这对我有效。如果你需要更具体的转换,可以查看Boost的lexical_castreinterpret_cast

unsigned char c = 40;
int i = static_cast<int>(c);
std::cout << i << std::endl;

或者:

unsigned char c = 40;
int i = (int)(c);
std::cout << i << std::endl;

更倾向于使用C++构造函数风格int(c),而不是C-cast风格:(int)(c) - jaques-sam

2
Google通常是一个很有用的工具,但答案非常简单:
unsigned char a = 'A'
int b = a

2

取决于你想做什么:

要将值作为ASCII码读取,可以写成

char a = 'a';
int ia = (int)a; 
/* note that the int cast is not necessary -- int ia = a would suffice */

要将字符 '0' -> 0, '1' -> 1 等转换为数字,您可以编写以下代码:

char a = '4';
int ia = a - '0';
/* check here if ia is bounded by 0 and 9 */

2

实际上,这是一种隐式转换。这意味着如果您的值没有溢出或下溢,它会自动转换。

这是一个例子:

unsigned char a = 'A';
doSomething(a); // Implicit cast

double b = 3.14;
doSomething((int)b); // Explicit cast neccesary!

void doSomething(int x)
{
...
}

为什么需要double->int的显式转换?它不会隐式地截断吗? - chris
1
是的,它可以运行,但是你会收到编译器警告,因此建议不要这样做。 - bytecode77
奇怪,我在GCC的最高级别上没有收到任何警告。 - chris

-1
char *a="40";
int i= a;

'a'中的值将是40的ASCII值(不会是40)。

相反,尝试使用在stdlib.h中定义的strtol()函数。

只需小心,因为此函数适用于字符串。它不适用于字符。


2
变量 a(和 i)的值将会是40,因为这是你刚刚赋的值。 - Bo Persson
2
如果你忽略编译器的警告,你会发现i得到了存储字符串“40”的地址,这当然就是'a'中所包含的。啊——让人回想起那些 ANSI 标准出现之前的好日子——当 C 语言还是弱类型时,程序员们的思维更加敏锐,可口可乐也是用真正的糖制成的!唉!这些年轻人……唉!! - Bob Jarvis - Слава Україні
1
问题是关于无符号字符的。你为什么要使用char*? - Aamir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接