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類型的字節數。
你理解的很正確。兩個問題的答案都是:對。
開始val被定義成int,就是說val的地址(就是&val)是整形數。但是一旦取出地址&val,你可以對這個地址的內容重新定義 (char *)就是告訴編譯器這個地址的指針內容當char的指針來讀。
這個可以看成是強制類型轉換,但不是標准的,標准的強制類型轉換是: (char) val 或者 char(val).
在32位的Windows操作系統中,int的數占用4個字節(byte),強制轉換成char後自動取最低一個字節(就是8位),這個是自動完成的,你就不用擔心了。不過因為pointer被定義成指向char的指針,它加以的時候(pointer++)僅僅加一個字節(8位)。
好問題!
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();
}
用這個多試試,會有較深的理解。