整數與浮點數
阿新 • • 發佈:2022-04-09
整數:
1、用二進位制補碼錶示;
2、c語言中整形常量有十進位制,八進位制,十六進位制,Java中有二進位制常量;
3、能精確表示;
4、能夠精確運算。
示例:
1、整型常量
/*演示整型常量的各種形式*/ printf("23 = %d\n", 23);//十進位制整數 printf("023 = %d\n", 023);//八進位制整數 printf("0x23 = %d\n", 0x23);//十六進位制整數 printf("0X23 = %d\n", 0X23);//十六進位制整數 printf("23L = %ld\n", 23L); //十進位制長整數 printf("23l = %ld\n", 23l); //十進位制長整數 printf("23u = %u\n", 23u); //十進位制無符號整數 printf("23U = %u\n", 23U); //十進位制無符號整數 printf("23UL = %u]n", 23UL);//十進位制無符號長整數
2、除與取餘
/*注意:不同的編譯器有不同的處理,如gcc和vc不支援0作為分母,而TC和java支援*/ printf("3.0 / 0 = %f\n", 3.0 / 0); //+ INF : 正無窮大 printf("-3.0 / 0 = %f\n", -3.0 / 0);//- INF : 負無窮大 printf("0 / 3.0 = %f\n", 0 / 3.0); //0.0:正常除法 printf("0.0/0 = %f\n", 0.0 / 0); //+ NAN :Not A Number printf("-0.0/0 = %f\n", -0.0 / 0); //- NAN :Not A Number printf("3 / 2 = %d\n", 3 / 2); //當兩個運算元均為整數,/做整除 printf("3.0 / 2 = %f\n", 3.0); //當至少有一個不為整數,/做浮點除 printf("3 %% 2 = %d\n", 3 % 2); //%為求餘運算,結果的符號與第一個操作的符號保持一致,結果的值為兩數絕對值求餘 printf("(-3) %% 2 = %d\n", (-3) % 2); printf("3 %% (-2) = %d\n", 3 % (-2)); printf("(-3) %% (-2) = %d\n", (-3) % (-2));
3、字元常量
/*演示字元常量的各種形式*/ printf("%c", 'n'); //一般字元形式,可顯示 printf("%c", '\n'); //轉義字元:換行 printf("%c",'\r'); //轉義字元:回車 printf("%c",'\b'); //轉義字元:退格 printf("%c",'\t'); //轉義字元:製表符 printf("%c",'\\'); //轉義字元:\ printf("%c",'\''); //轉義字元:' printf("%c",'\"'); //轉義字元:" printf("%c",'\123');// \hhh:八進位制格式,課1-3個h printf("%c",'\x30');// \xhh:十六進位制格式,可1-2個h
4、測定資料型別長度
int i = 0;
printf("char:%d bytes\n",sizeof(char));
printf("short:%d bytes\n",sizeof(short));
printf("i:%d bytes\n",sizeof(i));
printf("long:%d bytes\n",sizeof(long));
printf("float:%d bytes\n",sizeof(float));
printf("double:%d bytes\n",sizeof(double));
printf("1.23456:%d bytes\n",sizeof(1.23456));
printf("double:%d bytes\n",sizeof(double));
char ca[20];
char* pc = ca;
printf("sizeof('a')=%d\n",sizeof('a'));//c語言中'a'是字元常量,內部作為int型來處理,gcc環境下,而vc環境下是1
printf("sizeof(char)=%d\n",sizeof(char));//char型別,在記憶體中佔有一個位元組
printf("sizeof(\"a\")=%d\n",sizeof("a"));//"a"是字串,儲存了字元'a'和串結束符'\0'兩個字元
printf("sizeof(pc)=%d\n",sizeof(pc));//指標變數pc所佔的記憶體位元組數,64位環境下輸出8
printf("sizeof(ca)=%d\n",sizeof(ca));//數字ca總的佔的位元組數,輸出為20
5、資料範圍
/*需要包含<limits.h>標頭檔案*/
printf("signed char \t:%d bytes!\t[%d,%d]\n", sizeof(signed char), SCHAR_MIN, SCHAR_MAX);
printf("signed short \t:%d bytes!\t[%d,%d]\n", sizeof(signed int), SHRT_MIN, SHRT_MAX);
printf("signed int \t:%d bytes!\t[%d,%d]\n", sizeof(signed int), INT_MIN, INT_MAX);
printf("signed long int \t:%d bytes!\t[%d,%d]\n", sizeof(signed int), LONG_MIN, LONG_MAX);
printf("unsigned char \t:%d bytes!\t[0,%u]\n", sizeof(signed int), UCHAR_MAX);
printf("unsigned short \t:%d bytes!\t[0,%u]\n", sizeof(signed int), USHRT_MAX);
printf("unsigned int \t:%d bytes!\t[0,%u]\n", sizeof(signed int), UINT_MAX);
printf("unsigned long int \t:%d bytes!\t[0,%u]\n", sizeof(signed int), ULLONG_MAX);
浮點數:
1、用IEEE754標準儲存表示;
2、c語言和 java語言中均有十六進位制浮點數和十進位制浮點數;
3、浮點數不能精確儲存表示;
4、不能精確運算(大數吃小數;不同的運算順序,結果不一樣,例如:(a+b) +c 不一定等於 a+ (b+c) 不滿足結合律 )
示例:
1、浮點數
/*演示浮點數的書寫形式*/
//注意:形如0x1.0p+3的十六進位制形式,Turbo c編譯器並不支援,但gcc支援
printf("%lf\n", 3.5); //預設為雙精度浮點數3.5
printf("%lf\n", 3.); //3. = 3.0,縮寫形式
printf("%lf\n", .5); //.5 = 0.5,縮寫形式
printf("%f\n", 3.5f); //字尾f代表為單精度浮點數
printf("%f\n", 3.5F); //字尾F代表為單精度浮點數
printf("%lf\n", 3.5e+2); //3.5e+2 = 3.5 * 10^2
printf("%lf\n", 3.5e-2); //3.5e-2 = 3.5 * 10^(-2)
printf("%lf\n", 3.5E+2); //3.5E+2 = 3.5 * 10^2
printf("%lf\n", 3.5E-2); //3.5E-2 = 3.5 * 10^(-2)
printf("%lf\n", .5e3); //.5e3 = 0.5 * 10 ^ 3
printf("%lf\n", 3.5e2); //3.5e2 = 3.5 * 10 ^2
printf("%lf\n", 0x1.0p+3); //0x1.0p+3 = 0x1.0 * 2 ^3
/*C99中支援的十六進位制浮點數*/
printf("%f\n",0xb.3p2); // (11 + 3/16) * 4 = 44 + 3/4 = 44.75
2、大數吃小數
//一個很大的數與一個很小的數進行運算時,大數結果會忽略掉小數
printf("%.11f", 10000000000.0 + 0.000000001);
c語言中,帶符號數和無符號數做運算時,會先將帶符號的數轉換為無符號數再運算。
unsigned int x = 1;
int y = -1;
if (x > y) //帶符號數與無符號數比較時,帶符號數會被轉成無符號數,再進行比較
{ //-1的補碼為32個1,轉變為無符號數,y就變為了2^32-1;自然比1大
printf("Hello , world\n");
}
else
{
printf("你好,世界!\n");
}
兩個浮點數不能直接進行相等比較!(編譯器不同結果也可能不同)
浮點數在計算過程中可能就會有精度損失
/*浮點數相等比較不能用==,一般用兩數之差的絕對值小於一個很小的數來間接比較*/
double x, y, sum;
x = 0.1;
y = 0.2;
sum = 0.3;
if ((x + y) == sum) //這裡判斷條件應該為sum - (x+y) < 10^(-10)
{
printf("相等!\n");
}
else
{
printf("不相等!\n");//輸出不相等
}