類型轉換
自動轉換
小范圍的類型能夠自動轉換成大范圍的類型。short->int->long->float->double
強制類型轉換
(類型名)變量或數值
#include <stdio.h>
#include <stdlib.h>
// standared 標准
// input output 輸入/輸出
// header 頭 .h頭文件
int main() // 返回int,如果是void表示沒有返回
{
// 大類型就相當於把一瓶酒中的水,倒入酒盅里,會灑
double num = 6; // 小類型轉大類型 - 自動類型轉換
int num1=(int)num;// 大類型轉小類型,損失精度 - 強制類型轉換
return 0;
}
運算符和條件結構
賦值運算符、算術運算符、關系運算符、邏輯運算符
表達式是由一系列[操作符](operators)和[操作數](operands)組成的。
賦值運算符
=、+=、-=、*=、/=、%=
#include <stdio.h>
#include <stdlib.h>
// standared 標准
// input output 輸入/輸出
// header 頭 .h頭文件
int main() // 返回int,如果是void表示沒有返回
{
// 復合運算符
int num = 8;
num %= 5; // num = 8 % 5;
printf("%d",num); // 3
return 0;
}
算術運算符
一元:++、--
二元:+、-、*、/、%
關系運算符
> 、<
>=、<=
== 、 !=
#include <stdio.h>
#include <stdlib.h>
// standared 標准
// input output 輸入/輸出
// header 頭 .h頭文件
int main() // 返回int,如果是void表示沒有返回
{
// 關系運算符
int num1 = 5;
int num2 = 8;
int result = num1>num2;
printf("%d\n",result); // 0
return 0;
}
老九語錄,在高級語言中才有true、false。c語言中沒有這玩意。學習C語言能夠增加大家的內功。
邏輯運算符
|| && !
#include <stdio.h>
#include <stdlib.h>
// standared 標准
// input output 輸入/輸出
// header 頭 .h頭文件
int main() // 返回int,如果是void表示沒有返回
{
// 邏輯運算符
int hasHouse; // 有房嗎
int hasCar; // 有車嗎
printf("是否有房?\n");
scanf("%d",&hasHouse);
printf("是否有車?\n");
scanf("%d",&hasCar);
if (hasHouse && hasCar) {
printf("可以結婚");
} else {
printf("不可以結婚");
}
return 0;
}
位運算符(轉換為二進制進行計算)
&
|
~
^
<<
>>
#include <stdio.h>
#include <stdlib.h>
// standared 標准
// input output 輸入/輸出
// header 頭 .h頭文件
int main() // 返回int,如果是void表示沒有返回
{
// 邏輯運算符,位運算符
printf("%d\n",4 && 2); // 1
printf("%d\n",4 & 2); // 0 換算成二進制 0000-0100 0000-0010 與運算之后得到 0000-0110
printf("%d\n",4 | 2); // 6 換算成二進制 0000-0100 0000-0010 或運算之后得到 0000-0110
printf("%d\n",4 ^ 2); // 6 換算成二進制 0000-0100 0000-0010 位異或運算之后得到 0000-0110
printf("%d\n",~4); // -5 換算成二進制 0000-0100 非運算之后得到 1111-1011(補碼 -5) 原碼10000101 反碼11111010 補碼11111011
return 0;
}
原碼(原碼就是符號位加上真值的絕對值, 即用第一位表示符號,其余位表示值)、反碼(正數的反碼是其本身,負數的反碼是在其原碼的基礎上,符號位不變,其余各個位取反)、補碼(正數的補碼就是其本身,負數的補碼是在其原碼的基礎上,符號位不變, 其余各位取反,最后+1。【即在反碼的基礎上+1】)。
[+1] = [00000001]原 = [00000001]反 = [00000001]補
[-1] = [10000001]原 = [11111110]反 = [11111111]補
既然原碼才是被人腦直接識別並用於計算表示方式,為何還會有反碼和補碼呢?
因為人腦可以知道第一位是符號位, 在計算的時候我們會根據符號位, 選擇對真值區域的加減。 但是對於計算機, 加減乘數已經是最基礎的運算, 要設計的盡量簡單。計算機辨別"符號位"顯然會讓計算機的基礎電路設計變得十分復雜!於是人們想出了將符號位也參與運算的方法。 我們知道,根據運算法則減去一個正數等於加上一個負數。即: 1-1 = 1 + (-1) = 0 , 所以機器可以只有加法而沒有減法,這樣計算機運算的設計就更簡單了。
原碼計算: 1-1=0
1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2
得到的結果是不正確的。
反碼計算: 1-1=0
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0
發現用反碼計算減法,結果的真值部分是正確的。而唯一的問題其實就出現在"0"這個特殊的數值上。 雖然人們理解上+0和-0是一樣的,但是0帶符號是沒有任何意義的。而且會有[0000 0000]原和[1000 0000]原兩個編碼表示0。
補碼計算: 1-1=0
1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]補 + [1111 1111]補 = [0000 0000]補=[0000 0000]原 = 0
補碼的出現解決了0的符號以及兩個編碼的問題。