資料型別轉換,格式轉化

2021-09-27 13:03:31 字數 4110 閱讀 5621

從高到低的型別 : long double , double, float , unsigned long long,long long ,unsigned long , long, unsigned int, int。

排名的乙個例外是當 int 和 long int 的大小相同時。在這種情況下,unsigned int 將超越 long int,因為它可以儲存更高的值。

1.1.1 隱式轉化

當 c++ 使用運算子時,它會努力將運算元轉換為相同的型別。這種隱式或自動的轉換稱為型別強制。

規則 1:char、short 和 unsigned short 值自動公升級為 int 值。這是因為無論何時在數學表示式中使用這些資料型別的值,它們都將自動公升級為 int 型別。

規則 2:當運算子使用不同資料型別的兩個值時,較低排名的值將被公升級為較高排名值的型別。在下面的表示式中,假設 a 是乙個 int 變數,而 b 是乙個 double 變數,在運算發生前,a將公升值成為double變數。

規則 3:當表示式的最終值分配給變數時,它將被轉換為該變數的資料型別。如 c = a + b; 那麼無論a,b的型別是什麼,a+b都將會最終轉為c 的型別。

1.1.2 強制轉換

通過使用型別強制轉換表示式來完成。型別強制轉換表示式允許手動公升級或降級值。它的一般格式如下:

static_cast(value)

其中 value 是要轉換的變數或文字值,datatype 是要轉換的目標資料型別。以下是使用型別轉換表示式的**示例:

double number = 3.7;

int val;

val = static_cast(number);

雖然 static_cast 是目前使用最多的型別強制轉換表示式,但是 c++ 還支援兩種較舊的形式,這也是程式設計師應該有所了解的,即 c 風格形式和預標準 c++ 形式。

c 風格的轉換將要轉換的資料型別放在括號中,位於值要轉換的運算元的前面。因為型別轉換運算子在運算元前面,所以這種型別轉換表示法被稱為字首表示法,示例如下:

int b;

double a = (double)b ;

預標準 c++ 形式型別強制轉換表示式也是將要轉換的資料型別放在其值要轉換的運算元之前,但它將括號放在運算元周圍,而不是圍繞資料型別。這種型別轉換表示法被稱為功能性表示法,示例如下:

int b=10 ;

int c = 4;

double a = b(double)/ c;

特別注意的是,在c++11中,增加了auto關鍵字,轉換型別相對智慧型化

auto c=(int)(9.87)   結果c=9
(2)string與char * ,char arr

string----const char *

c_str()生成乙個const char*指標,指向以空字元終止的陣列。

例1:const char *c; string s=」1234」; c=s.c_str();cout《例2:string str=」lol」; char * ptr=new char[str.length()+1]; strcat(ptr,str)

string—char s

可以利用strcpy函式(需先轉換成const char *)或者利用迴圈對字元陣列逐一賦值

例:string s(『test』);char str[10];

strcpy(str,s.c_str())

for(inti=0;ichar s與char *------string

可以直接賦值 char *ptr; char arr; string s1=ptr; string s2=arr;

(3)char *與int

標頭檔案:#include

atoi() 函式用來將字串轉換成整數(int),其原型為:intatoi (const char * str);

例:char *numchars=「1234」; int num=atoi(numchars); 結果為1234

itoa()函式用於整數到字串的轉換,其原型為:char*itoa(int value, char *string, int radix);

例:int num=1234; int radix=8; char res[20]; itoa(num,res,radix);

printf("%d(10)=%s(%d)\n",num,res,radix);//輸出1234(10)=2322(8) 這裡radix指的是進製
同時c++還提供標準庫函式有:long int atol ( const char * str ); double atof (constchar* str);

stof()、strtod()、strtol()、strtoul()、atoll()、strtof()、strtold()、strtoll()、strtoull(),詳情可在網上查閱。

(4)string與int

利用stoi()直接轉換

例:string s=」1234」;int b=stoi(s) 結果為1234

利用atoi()間接轉換

例:string s=」1234」;int b=atoi(s.c_str()) 結果為1234

(5)sprintf作用是將printf的輸出結果儲存在字串陣列中

sprintf轉換型別的功能比較強大

sprintf函式的格式:

int sprintf( char *string_buffer, const char *format_string[, args] );

除了前兩個引數固定外,可選引數可以是任意個。buffer是字元陣列名;format是格式化字串(像:"%3d%6.2f%#x%o",%與#合用時,自動在十六進製制數前面加上0x)。只要在printf中可以使用的格式化字串,在sprintf都可以使用。其中的格式化字串是此函式的精華。

(6)unsigned char 轉 char

多個unsigned char 陣列拼接以及陣列間資料用"|「分隔,最後乙個陣列後不跟」|",以及資料中有 0x00,以下方法非常有用:

如果把unsigned char轉為 char ,因為str判斷以『\0』結尾,這樣會丟資料

同理:memcpy,strncpy 拷貝同樣存在一些問題。

步驟: 1. 新建臨時陣列 char tmp_str ,初始char陣列為0,最終結果字串str_rfid

2. 迴圈要拼接的陣列數量,新建函式pack_rfid_str(char* const str_out, u8* d_buf, int d_len);

3. 利用指標移動,將陣列的資料拼接到臨時陣列中,並在每個陣列後加字元 『|』

4.最終成型的結果不需要末尾跟 | ,那麼就需要把臨時char陣列賦給str變數 str_rfid,然後memcpy拷貝,size_t n 最好用str_rfid.length() -1,減去的就是末尾 | ,而strlen()獲取的則是包含』\0』的長度,-1報錯。

char tmp_str[1024];

memset(tmp_str, 0, 1024);

std::string str_rfid;

for (i = 0; i < _process_data.rfid.label_cnts; i++)

log_info("master", "rfid info=%s", tmp_str);

str_rfid = tmp_str;

memcpy(_snd_msg.upload_data.car_ec_no, str_rfid.c_str(), str_rfid.length()-1);

int  pack_rfid_str(char* const str_out, u8* d_buf, int d_len) 

return 0;

}

std::string utf8_to_gb2312(char * in)

char* convertgb2312toutf8(const char* gb2312)

Oracle日期型別轉換格式

將日期型轉換成字串時,可以按新的格式顯示。如格式yyyy mm dd hh24 mm ss表示 年 月 日 小時 分鐘 秒 oracle的日期型別是包含時間在內的。主要的日期格式字元的含義如下表所示 代表的格式 例子 am pm 上午 下午 08 am d數字表示的星期 1 7 1,2,3,7 dd...

Oracle日期型別轉換格式

將日期型轉換成字串時,可以按新的格式顯示。如格式yyyy mm dd hh24 mm ss表示 年 月 日 小時 分鐘 秒 oracle的日期型別是包含時間在內的。主要的日期格式字元的含義如下表所示 代表的格式 例子 am pm 上午 下午 08 am d數字表示的星期 1 7 1,2,3,7 dd...

常用的資料轉換格式

字串轉整型 int atoi const char str uint8 t temp len n 0,temp len 0 char temp data 10 temp len atoi temp data printf中fputc重寫 需要先包含 include stdio.h 然後新增 如下 i...