一个static_cast引发的char转int问题
写了一段程序,放在某个群里,一同学说我这里用staic_cast有问题,不安全!
还请大家指点指点!
- C/C++ code
// 读取出来大于'A'--17小于'a'的要重新计算值inline int CalcHigh_a( const char strHex ){ return static_cast<int>( strHex ) - CALCLETTER;}// 读取出来大于9小于'A'的要重新计算值inline int CalcHigh_A( const char strHex ){ return static_cast<int>( strHex ) - CALCHIGH;}
附上完整的代码:-------------我是觉得写得有点不太好看,需要怎么调整一下?
- C/C++ code
#include "stdafx.h"#include "iostream"using namespace std;#define TRANSPOSEDIGIT 4// assist function#define DECIMALLENGTH0 1#define DECIMALLENGTH1 2#define DECIMALLENGTH2 3#define DECIMALLENGTH3 4#define CONVERT 48#define CALCHIGH ( 48 + 7 )#define CALCLETTER ( 48 + 7 + 32 )#define LIMITNINE 16#define LIMITA 31// 读取出来大于'A'--17小于'a'的要重新计算值inline int CalcHigh_a( const char strHex ){ return static_cast<int>( strHex ) - CALCLETTER;}// 读取出来大于9小于'A'的要重新计算值inline int CalcHigh_A( const char strHex ){ return static_cast<int>( strHex ) - CALCHIGH;}// 计算十六进制字符串的值int CalcStrDecimal( const char* strHex, const int nHexLength ){ int iResult = 0; int ii = 0; if ( DECIMALLENGTH0 == nHexLength ) { ii = static_cast<int>( strHex[ 0 ] ) - CONVERT; if ( ii > LIMITNINE && ii < LIMITA ) { ii = CalcHigh_A( strHex[ 0 ] ); } else if ( ii > LIMITA ) { ii = CalcHigh_a( strHex[ 0 ] ); } iResult += ii; } else if ( DECIMALLENGTH1 == nHexLength ) { for ( int i = 0; i < nHexLength; i++ ) { ii = static_cast<int>( strHex[ i ] ) - CONVERT; if ( ii > LIMITNINE && ii < LIMITA ) { ii = CalcHigh_A( strHex[ 0 ] ); } else if ( ii > LIMITA ) { ii = CalcHigh_a( strHex[ 0 ] ); } switch( i ) { case 0: ii = ii << TRANSPOSEDIGIT; break; default: break; } iResult += ii; } } else if ( DECIMALLENGTH2 == nHexLength ) { for ( int i = 0; i < nHexLength; i++ ) { ii = static_cast<int>( strHex[ i ] ) - CONVERT; if ( ii > LIMITNINE && ii < LIMITA ) { ii = CalcHigh_A( strHex[ 0 ] ); } else if ( ii > LIMITA ) { ii = CalcHigh_a( strHex[ 0 ] ); } switch( i ) { case 0: ii = ii << TRANSPOSEDIGIT << TRANSPOSEDIGIT; break; case 1: ii = ii << TRANSPOSEDIGIT; break; default: break; } iResult += ii; } } else if ( DECIMALLENGTH3 == nHexLength ) { for ( int i = 0; i < nHexLength; i++ ) { ii = static_cast<int>( strHex[ i ] ) - CONVERT; if ( ii > LIMITNINE && ii < LIMITA ) { ii = CalcHigh_A( strHex[ 0 ] ); } else if ( ii > LIMITA ) { ii = CalcHigh_a( strHex[ 0 ] ); } switch( i ) { case 0: ii = ii << TRANSPOSEDIGIT << TRANSPOSEDIGIT<< TRANSPOSEDIGIT; break; case 1: ii = ii << TRANSPOSEDIGIT << TRANSPOSEDIGIT; break; case 2: ii = ii << TRANSPOSEDIGIT; break; default: break; } iResult += ii; } } return iResult;}int _tmain(int argc, _TCHAR* argv[]){ // length == 3// char strTest[ 5 ] = "A202";// char strTest[ 5 ] = "a202";// char strTest[ 5 ] = "B202";// char strTest[ 5 ] = "b202";// char strTest[ 5 ] = "c202";// char strTest[ 5 ] = "C202";// char strTest[ 5 ] = "d202";// char strTest[ 5 ] = "D242";// char strTest[ 5 ] = "0202";// int lValue = CalcStrDecimal( strTest, 4 );// char strTest[ 5 ] = "002"; char strTest[ 5 ] = "A22";// char strTest[ 5 ] = "AAA"; int lValue = CalcStrDecimal( strTest, 3 );// char strTest[ 5 ] = "02";// char strTest[ 5 ] = "a2";// char strTest[ 5 ] = "AA";// int lValue = CalcStrDecimal( strTest, 2 ); // char strTest[ 5 ] = "A";// char strTest[ 5 ] = "a";// int lValue = CalcStrDecimal( strTest, 1 ); cout << lValue << endl; return 0;}// hex202 == int514
[解决办法]
呃,没看出来有啥问题
[解决办法]
没看出来static_cast成int有啥问题。
char表示的整数值范围是int的真子集。
倒是这里干嘛这么麻烦,还依赖基本字符集中某些元素的连续性……直接用<cchar>里的一些函数不行么?
[解决办法]
完全没有问题,直接赋值都行的。int完全能兼容char
[解决办法]
strtol
[解决办法]
你自己很享受造轮子的过程,加油吧
[解决办法]
[解决办法]
[解决办法]
参考:
区别:static _cast、dynamic _cast、reinterpret_cast和const_cast
[解决办法]
看不出来什么问题