程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言的 (強制類型轉換) 以及 '字符字面值',字符面值

C語言的 (強制類型轉換) 以及 '字符字面值',字符面值

編輯:關於C語言

C語言的 (強制類型轉換) 以及 '字符字面值',字符面值


C語言的顯式/隱式類型轉換,都有一個中間變量的存在,原數據的類型、內容都不變。

 

以下代碼,都用GCC編譯。

 

 1 #include<stdio.h>
 2 
 3 int main()
 4 {
 5     printf("%d %d\n", 'a', sizeof((int)'a'));    //輸出為97,4.  sizeof的作用對象為一個int型中間變量
 6     
 7     char c = 255;
 8     printf("%d\n", c);    //輸出-1.  char型的c已溢出,隱式轉換為int後同樣保持為-1
 9 
10     return 0;
11 }

 

之前以為單引號多字符,比如'123'會報錯,測試了一下才發現只會警告(GCC,代碼裡給出警告信息),能編譯通過:

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     printf("%d\n", '1'        );  //輸出49
 6     printf("%d\n", '12'       );  //輸出12594       警告:warning: multi-character character constant
 7     printf("%d\n", '123'      );  //輸出3224115     警告:同上
 8     printf("%d\n", '1234'     );  //輸出825373492   警告:同上
 9     printf("%d\n", '12345'    );  //輸出842216501       警告:warning: character constant too long for its type
10     printf("%d\n", '123456'   );  //輸出859059510       警告:同上
11     printf("%d\n", '1234567'  );  //輸出875902519       警告:同上
12     printf("%d\n", '12345678' );  //輸出892745528       警告:同上
13     printf("%d\n", '123456789');  //輸出909588537       警告:同上
14 
15     return 0;
16 }

以上分別輸出1~9個數字組成的字符字面值,輸出類型為int型,中間有個隱式類型轉換的過程。

第一行輸出'1'的ASCII碼值49;

第二行則將'1'和'2'的ASCII碼值分別賦予int型中間變量的低位2個字節,即0x3132,所以輸出為12594 = (49 << 8) + 50;警告信息提示為多字符字面值;

第三四行的結果原理同上;

第五行以下的,原理同上,但是只取低4位,例如第9行,只取'6789',即0x36373839;警告信息提示字符字面值超出int類型的字節數。

 


C語言強制類型轉換

你理解的很正確。兩個問題的答案都是:對。

開始val被定義成int,就是說val的地址(就是&val)是整形數。但是一旦取出地址&val,你可以對這個地址的內容重新定義 (char *)就是告訴編譯器這個地址的指針內容當char的指針來讀。
這個可以看成是強制類型轉換,但不是標准的,標准的強制類型轉換是: (char) val 或者 char(val).

在32位的Windows操作系統中,int的數占用4個字節(byte),強制轉換成char後自動取最低一個字節(就是8位),這個是自動完成的,你就不用擔心了。不過因為pointer被定義成指向char的指針,它加以的時候(pointer++)僅僅加一個字節(8位)。
 

C語言強制類型轉換

好問題!

C語言中這樣的轉換,轉換的是和(double)最近的右邊的數據,運算級別低於括號,但是高於乘除、加減、賦值符等;而你考慮的k/m的問題:這個關鍵看進行二元運算的精度的最高級別,二元運算的兩個變量中:精度較低的會自動轉換為精度較高的;

#include<stdio.h>
main(){
int m,n,num;
char t='0',th;
double dou_1,dou_2,dou_3;
m=5;n=321;
num=t/((float)m/n);
dou_1=(double)(n/m);
dou_2=n/m;
dou_3=(double)n/m;
th=(double)n/m;
printf("%d,%f,%f,%f,%c",num,dou_1,dou_2,dou_3,th);
getch();
}
用這個多試試,會有較深的理解。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved