在C和C ++中将char转换为int

如何在C和C ++中将char转换为int

取决于你想做什么:

读取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 */ 

C和C ++总是将types提升到至lessint 。 此外字符文字在C中是inttypes,在C ++中是chartypes。

你可以简单地通过赋值给一个int来转换一个chartypes。

 char c = 'a'; // narrowing on C int a = c; 

那么,在ASCII码数字从48开始。 所有你需要做的是:

 int x = (int)character - 48; 

char只是一个1字节的整数。 chartypes没有什么魔力! 就像你可以把一个short分配给int,或者把一个int分配给long一样,你可以把一个char分配给一个int。

是的,原始数据types的名称恰好是“char”,暗示它应该只包含字符。 但事实上,“字符”只是一个可怜的名字select混淆每个人试图学习语言。 一个更好的名字是int8_t,如果你的编译器遵循最新的C标准,你可以使用这个名字。

当然,在进行string处理时,您应该使用chartypes,因为经典ASCII表的索引适合1个字节。 然而,你也可以使用常规整数进行string处理,虽然在现实世界中没有实际的理由,为什么你永远不想这么做。 例如,下面的代码可以很好地工作:

  int str[] = {'h', 'e', 'l', 'l', 'o', '\0' }; for(i=0; i<6; i++) { printf("%c", str[i]); } 

你必须认识到,字符和string只是数字,就像电脑里的其他东西一样。 当你在源代码中写入'a'时,它被预处理成数字97,这是一个整数常量。

所以,如果你写一个expression式

 char ch = '5'; ch = ch - '0'; 

这实际上相当于

 char ch = (int)53; ch = ch - (int)48; 

然后再通过C语言进行整数升级

 ch = (int)ch - (int)48; 

然后截断为char来适应结果types

 ch = (char)( (int)ch - (int)48 ); 

在这些行之间有很多细微的东西,其中char被隐式地看作int。

(这个答案解决了C ++方面的问题,但是C中也存在符号扩展问题。)

处理所有三种字符types(有符号,无符号和“字符”)比第一次出现更加微妙。 范围从0到SCHAR_MAX(对于8位字符为127)的值很容易:

 char c = somevalue; signed char sc = c; unsigned char uc = c; int n = c; 

但是,当某个值超出该范围时,只有通过unsigned char才能为所有三种types的“相同”char值提供一致的结果:

 char c = somevalue; signed char sc = c; unsigned char uc = c; // Might not be true: int(c) == int(sc) and int(c) == int(uc). int nc = (unsigned char)c; int nsc = (unsigned char)sc; int nuc = (unsigned char)uc; // Always true: nc == nsc and nc == nuc. 

使用<ctype>函数时,这是非常重要的,比如isupper或toupper,因为符号扩展:

 char c = negative_char; // Assuming CHAR_MIN < 0. int n = c; bool b = isupper(n); // Undefined behavior. 

注意通过int的转换是隐式的; 这有相同的UB:

 char c = negative_char; bool b = isupper(c); 

为了解决这个问题,可以通过unsigned char来完成,通过使用safe_ctype包装<ctype>函数很容易:

 template<int (&F)(int)> int safe_ctype(unsigned char c) { return F(c); } //... char c = CHAR_MIN; bool b = safe_ctype<isupper>(c); // No UB. std::string s = "value that may contain negative chars; eg user input"; std::transform(s.begin(), s.end(), s.begin(), &safe_ctype<toupper>); // Must wrap toupper to eliminate UB in this case, you can't cast // to unsigned char because the function is called inside transform. 

这是有效的,因为任何采用三种字符types的函数都可以采用其他两种字符types。 它导致了两个可以处理任何types的函数:

 int ord(char c) { return (unsigned char)c; } char chr(int n) { assert(0 <= n); // Or other error-/sanity-checking. assert(n <= UCHAR_MAX); return (unsigned char)n; } // Ord and chr are named to match similar functions in other languages // and libraries. 

Ord(c)总是给你一个非负值 – 即使当传递一个负char或负signed char时 – 而chr取任何值ord产生并返回完全相同的char。

在实践中,我可能只是通过unsigned char而不是使用这些来投射,但是他们可以简单地包装投射,为int-to-char添加错误检查提供了一个方便的地方,并且在需要的时候会更短更清晰几近使用它们。

这取决于你的意思是“转换”。

如果你有一系列代表一个整数的字符,比如“123456”,那么在C中有两种典型的方法:使用像atoi()或strtol()这样的特殊用途的转换,或者通用的sscanf () 。 C ++(这实际上是一个伪装成升级的不同语言)增加了第三个stringstream。

如果你的意思是你想在你的一个intvariables中的确切的位模式被视为一个char ,那更容易。 在C中,不同的整数types实际上比实际的单独“types”更具有精神状态。 只要在要求char的地方开始使用,你应该没问题。 你可能需要一个明确的转换来使编译器不时发出呜呜声,但是应该做的就是丢掉超过256的额外位。

使用static_cast<int>

 int num = static_cast<int>(letter); // if letter='a', num=97 

编辑:你可能应该尽量避免使用(int)

int num =(int)letter;

为什么使用static_cast <int>(x)而不是(int)x? 获取更多信息。

大概你需要这个转换来使用C标准库中的函数。

在这种情况下,请执行(C ++语法)

 typedef unsigned char UChar; char myCppFunc( char c ) { return char( someCFunc( UChar( c ) ) ); } 

expression式UChar( c )转换为unsigned char为了摆脱负值,除了EOF,C函数不支持。

然后,该expression式的结果被用作intforms参数的实际参数。 你在哪里得到自动提升到int 。 你也可以直接写最后一步,比如int( UChar( c ) ) ,但是我个人觉得这个过于冗长。

干杯&hth。,

我有一个像"7c7c7d7d7d7d7c7c7c7d7d7d7d7c7c7c7c7c7c7d7d7c7c7c7c7d7c7d7d7d7c7c2e2e2e"字符数组转换成其实际的整数值,可以由“7C”表示为一个hex值的问题。 所以,在巡航寻求帮助后,我创造了这个,并认为分享会很酷。

这将charstring分隔为正确的整数,可能对更多的人有帮助,而不仅仅是我);)

 unsigned int* char2int(char *a, int len) { int i,u; unsigned int *val = malloc(len*sizeof(unsigned long)); for(i=0,u=0;i<len;i++){ if(i%2==0){ if(a[i] <= 57) val[u] = (a[i]-50)<<4; else val[u] = (a[i]-55)<<4; } else{ if(a[i] <= 57) val[u] += (a[i]-50); else val[u] += (a[i]-55); u++; } } return val; } 

希望它有帮助!

对于字符或短到int,你只需要分配的值。

 char ch = 16; int in = ch; 

与int64相同。

 long long lo = ch; 

所有的值将是16。

我在C中绝对没有技巧,但是对于一个简单的parsing:

 char* something = "123456"; int number = parseInt(something); 

…这对我有用:

 int parseInt(char* chars) { int sum = 0; int len = strlen(chars); for (int x = 0; x < len; x++) { int n = chars[len - (x + 1)] - '0'; sum = sum + pow(n, x); } return sum; } int powInt(int x, int y) { for (int i = 0; i < y; i++) { x *= 10; } return x; }