c語言中類型轉換與賦值運算符、算術運算符、關系運算符、邏輯運算符。原碼、反碼、補碼。小解。


類型轉換

自動轉換

小范圍的類型能夠自動轉換成大范圍的類型。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的符號以及兩個編碼的問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM