C語言基礎程序設計

1 概論

程序(指令和數據的集合)在運行時,首先會被加載到內存(此時稱爲進程),而後由CPU經過控制器的譯碼從內存中讀取指令,並按照指令的要求,從存儲器中取出數據進行指定的運算和邏輯操做等加工,而後再按照地址把結果送到內存中去。這就是計算機工做最基本的原理了。css

可是做爲準備成爲一名優秀的C語言程序員,必須更加深刻的瞭解數據在計算機內存存儲和CPU計算的內幕。linux

2 進制

2.1 進制的介紹

在最底層,計算機數據都是採用二進制的補碼來進行存儲和運算的,可是爲了方便使用,平常生活中使用更多的進制類型是八進制(0開頭,包含0-7之間的八個數據),十進制(0-9之間的10個數據)和十六進制(0x開頭,包含0-9和a-f之間的16個字母加數字的組合),其中八進制的典型用例就是linux系統的權限,十六進制就是變量的內存地址,而c語言中的整數默認就採用十進制來表示。 
c語言沒有提供二進制的數據表現形式!!!程序員

2.2 進制的運算與轉換

相同進制類型數據進行運算時會遵照加法:逢R進1;減法:借1當R,其中R就表示進制。而每一個八進制的數據都會對應3個二進制的數據(2^3=8),同理每一個十六進制的數據都會對應4個二進制的數據(2^4=6),所以八進制轉二進制以及十六進制轉二進制的相互轉換是相對十進制轉二進制相對簡單。面試

2.2.1 二進制,八進制,十六進制轉換成十進制

在將二進制,八進制,十六進制轉換爲十進制時首先看看一個十進制的整數是如何計算的:編程

1234=1000+200+30+4=1*10^3+2*10^2+3*10^1+4*10^0

所以能夠採用按權相加的形式計算二進制,八進制和十六進制轉換爲十進制的結果,數組

二進制轉十進制的計算方式:安全

100101=1*2^5+1*2^2+1*2^0=32+4+1=37服務器

八進制轉十進制的計算方式:微信

27=2*8^1+7*8^0=15函數

十六進制轉十進制的計算方式:

20d=2*16^2+13*16^0=512+13=525

2.2.2 二進制,八進制轉換

二進制轉換成八進制,從右向左,每3位爲一組(不足3位用0補全),轉換成八進制

101101=55

八進制轉換成二進制,用3位二進制數替代每一位八進制數

55=101101

2.2.3二進制,十六進制轉換

二進制轉換爲十六進制,從右向左,每4位一組(不足用0補齊),轉換爲十六進制

11011101=dd

十六進制轉換爲二進制,用4位二進制代替每一位十六進制的數

dd=11011101

2.2.4 十進制,二進制轉換

十進制整數轉換爲二進制:方法是除以2取餘,直到商數爲0,逆序排列,以22爲例:倒序的二進制結果就是10110

22/2 餘 0 
11/2 餘 1 
5 /2 餘 1 
2/2 餘 0 
1/2 餘 1 
0

360面試題: 
十進制小數轉換爲二進制:方法是乘以2,直到小數部分爲0爲止,取整順序排列,以0.725爲例:順序排列的二進制結果就是0.11

0.725*2=1.5 取整 1 
0.5*2=1 取整 1

2.4編程實現十進制轉換成二進制

#define _CRT_SECURE_NO_WARNINGS//關閉VS2015的安全檢查 #include <stdio.h> /* 十進制的正整數轉換爲二進制 @author Tony 18601767221@163.com @since 20160525 12:05 */ void decimal() { /* 1.該程序只能將0-32767之間的正整數轉換爲對應的二進制形式,將轉換後的結果存儲於數組中,所以 聲明一個16個長度的整數數組來保存二進制的結果 */ int numbers[16] = { 0 }; //聲明一個1包含16個整數元素的數組 初始化全部的元素值爲0 /* 2.使用scanf函數讀取用戶輸入的0-32767之間的正整數,使用循環來除以2,直至商數爲0時,將除以2的餘數保存在數組中 */ int number = 0; printf("請輸入一個0-32767之間的整數\n"); scanf("%d", &number); for (int i = 0; i < 15; i++) { //由於只考慮正數,所以最高位的符號位爲0,少一次循環除以2 int remainder = number % 2; //餘數 int quotient = number / 2; //商數 //將除以2以後的商數賦值給number number = quotient; //將餘數賦值給數組中的元素 numbers[i] = remainder; } /* 3.反向遍歷數組中的元素,也就是16個二進制的整數,從最後一個元素到第一個元素 */ for (int i = 15; i >= 0; i--) { printf("%d", numbers[i]); //每四個二進制整數之間使用table分割 if (i % 4 == 0) { printf("\t"); } } } void main() { decimal(); //調用方法 system("pause"); }

3 計算機信息存儲

先理清楚兩個傳輸和存儲單位:位(bit)和字節(byte) 
計算機最底層的數據都是二進制的01010組成,所以最小的傳輸傳輸單位(寬帶的網速就是以bit來計算的)爲位 (bit),1bit能夠存儲的值爲0或者1。

字節(Byte)是計算機中最經常使用的基本存儲單位,1個字節表示8個位,也就是

1Byte=8bit

而在計算機的平常使用中,下載的速度一般是KB或者MB,1KB=1024Byte,1MB=1024KB,

筆記本的移動硬盤或者服務器的硬盤一般都是GB或者TB,1GB=1024MB,1TB=1024GB

爲何32位操做系統只能使用4G不到的內存?

4G=2^2*2^10*2^10*2^10=2^32

由於操做系統運行時還要佔據必定的內存,因此4G內存條的可用內存大概是3.2G左右 
而KB,MB,GB,TB之間是採用2的十次方也就是1024進行運算的。

隨着數據的日益增加,以BAT爲表明的互聯網公司處理的海量數據已經達到PB級別,1PB到底有多大?

1PB=1024TB=1024*1024GB=1024*1024*1024MB=(2^30) MB

4 常量

人生實際上就是一場打怪升級的遊戲,而當你註冊成爲一個新的玩家以後,綁定的身份證信息是永遠不會變的,這個實際上就是常量。 
C語言中的常量能夠用兩種方式來實現,分別是const varriableName=value;#define CONST_NAME CONST_VALUE。其中const修飾的變量有內存地址,能夠經過引用指針來修改常量值,而#define是真正意義上的常量,由於它在CPU寄存器內部,C語言能操做內存,可是沒有直接操做CPU的方法(沒法直接獲取地址值和變量值)。

使用指針修改const的常量示例:

#include <stdio.h> /* 使用指針修改常量的值 @author tony 18601767221@163.com @since 20160524 20:11 */ void change_constants() { const int score = 99; //使用const定義常量 //score = 12; //const只能避免變量顯示修改,能夠經過內存地址來修改 // * 根據地址取出內容 (int *) 強制類型轉換,轉換爲很是量類型 *(int*)(&score) = 98; //經過指針修改const變量的值 printf("score =%d \n",score); }

使用常量能夠提升代碼的複用性,實現批量修改:

#define PI 3.1415926 //當改變該常量的值,全部引用該常量的變量值都會修改 #include <stdio.h> /* 使用常量提升代碼的複用性 @author tony 18601767221@163.com @since 20160524 20:11 */ void use_define() { double pi = PI; //預編譯時會替換成pi的值 printf("pi = %.7f",pi); }

5 變量

迴歸到計算機的本質:程序運行時,數據和指令都會被加載到內存中,而CPU會從內存中讀取指令和數據,根據不一樣的指令對數據進行不一樣的邏輯計算,從而產生對應的計算結果存放到內存中,而變量正是用來存儲運算過程當中隨着不一樣業務邏輯產生對應運算結果的容器。

5.1 變量的聲明和初始化

有了變量,編譯器就能夠經過它聲明時指定的數據類型,開闢對應的內存空間來存儲數據。

變量名和函數名必須準守不能以數字開頭,包含字母數字和下劃線組成。 
在使用變量的時候還須要考慮到不一樣的編譯器: 
VisualStudio2015提供了中文良好的支持(變量直接使用中文),而GCC編譯器不支持中文。並且C語言嚴格區分大小寫

由於C語言不會像Java那樣針對類中的每一個成員變量的不一樣數據類型賦初始值,因此咱們在C語言中聲明變量時必須初始化變量的值。

有些C語言的編譯器(例如VC2010之前的編譯器或者GCC編譯器沒有開啓C++11支持)還會要求在函數調用以前聲明並初始化變量。

#include <stdio.h> /* 變量的聲明和初始化賦值 @author Tony 18601767221@163.com @since 20160524 20:41 */ void varriable_declare() { int age = 28; //聲明整形變量並賦初始值爲28 printf("age = %d\n"); int length, width, area; //一次性聲明多個變量 length = 12; width = 12; area = length*width; }

爲何變量必定要初始化呢? 
內存是隨機分配的,當一個進程結束後,它佔據的內存被釋放,可是內存中的數據依然存在,若是不給變量賦初始值,系統會給變量初始化一個垃圾值。 
爲何變量必定要初始化呢

5.2 變量在內存中的存儲機制以及CPU運算原理

當聲明變量並初始化賦值時,編譯器會建立一張表,表中包含變量地址,類型,變量名和內存中內存地址以及內存空間相關聯,對變量的一切操做其實是修改變量映射在內存地址關聯的內存空間存儲的值。所以不能使用未聲明的變量!!!

這裏咱們有必要再聊聊CPU(寄存器)和內存,採用一段C語言嵌套簡單的彙編代碼(由於彙編能夠直接操做CPU,看起來更加直觀)來講明在計算機完成計算的過程當中,它倆到底作了什麼事?

#include <stdio.h> /* c嵌套匯編 演示賦值的原理 @author Tony 18601767221@163.com @since 20160524 21:05 */ void c_asm() { int age = 0; printf("age 變量的地址爲%p\n",&age); //彙編語言 _asm { //變量的賦值是經過CPU的寄存器來實現的 mov eax, 28 //將28移動到eax寄存器 mov age,eax//將eax的值移動到age } printf("age =%d",age); }

寄存器賦值

從調試的頁面中就能夠看得出賦值(也是一種運算)是在CPU的寄存器中完成的,而實際上各類邏輯運算的都是存儲CPU的寄存器內部,而後經過內存地址傳遞給對應的存儲空間。

C代碼演示數據計算的過程:

#include <stdio.h> /* 顯示三個整數變量的地址和值信息 @author Tony 18601767221@163.com @since 20160514 15:10 */ void show_varriable_info(int length,int width,int area) { printf("變量地址信息!!!\n"); printf("length變量對應的內存地址%p\n width變量對應的內存地址%p\n area變量對應的內存地址%p\n", &length, &width, &area); printf("變量值信息!!!\n"); printf("length =%d\n width=%d\n area=%d\n", length, width, area); } /* 變量的運算 @author Tony 18601767221@163.com @since 20160524 20:59 */ void varriable_operation() { int length = 2; int width = 2; int area = 0 ; show_varriable_info(length,width,area); area = length*width; show_varriable_info(length, width, area); }

6 數據類型

數據類型是對程序所處理的數據(變量的類型,方法的返回類型)的」抽象」,將計算機中可能出現的數據類型進行分類,先上個C語言數據類型的全家福: 
C語言數據類型

C語言中的數據類型所佔據的內存空間是和操做系統相關,相同的數據類型在不一樣的平臺上佔據的內存空間多是不同的,可使用sizeof關鍵字獲取佔據的內存空間大小,內存大小不一樣,存儲的取值範圍也會不一樣。

6.1 整數

整數用於存放像遊戲中的玩家級別,人的年齡等等數據。

C語言中的整數按照佔據的字節數從小到大能夠分爲short,int,long,long long,其中在16位系統上short和int佔據的內存是同樣的(佔據兩個字節),而在32位以上系統int和long佔據的內存是同樣的(佔據四個字節。)

#include <stdio.h> /* int和long是等價的 在32位以上的操做系統上 @author Tony 18601767221@163.com @since 20160525 12:36 */ void int_long_info() { printf("int在Windows10 X64位操做系統上佔據的字節爲:%d\n",sizeof(int)); printf("long在Windows10 X64位操做系統上佔據的字節爲:%d\n", sizeof(long)); } void main() { int_long_info(); getchar(); }

而long long是爲了可以存儲相似於QQ號或者身份證號等超大的整數(佔據八個字節)

#include <stdio.h> /* 大整數 @author Tony 18601767221@163.com @since 20160525 12:53 */ void longlong_data() { long long ID = 421023197912237234; //定義一個身份證號 printf("ID=%lld\n", ID); printf("long long 佔據的字節數量爲 :%d",sizeof(long long)); } void main() { longlong_data(); getchar(); }

C語言中的整數可使用八進制,十進制和十六進制表示,同時整數還有有符號(singed)和無符號(unsinged)兩種方式,其中無符號和有符號佔據的內存空間是同樣大,可是不能存儲負數(最小值是0),最大值要大於有符號的最大值。

整數的三種進制以及有符號和無符號的區別

#include <limits.h> //引入整數的極限值頭文件 #include <stdio.h>//引入標準輸入輸出頭文件 /* 整數的使用 @author Tony 18601767221@163.com @since 20160525 12:53 */ void int_use() { int octal = 012; //定義八進制的整數變量 int decimal = 12; //定義十進制的整數變量 int hex = 0x12; //定義十六進制的整數變量 unsigned int u_int_max = UINT_MAX; int int_max = INT_MAX; printf("無符號int表示的最大值%u \n有符號int表示的最大值爲%d",u_int_max,int_max); }

每一個整數的取值範圍已經在limits.h頭文件中使用常量的方式定義: 
整數的極限定義

其中最經常使用的整數是int,在使用的過程當中須要注意值不能超過變量數據類型的取值範圍,不然會形成數據溢出,竟而致使計算錯誤。

6.2 浮點數

浮點數就是數學中的小數,由於計算機的內存是有限的,不能存儲數學中的無理數,例如float只能精確到小數點後6-7位(佔據四個字節),而double能精確到小數點後15位(佔據八個字節)。 
C語言中的浮點數能夠採用數學中的小數(例如3.14,默認是double類型,加後綴f表示float類型)和科學記數法(例如2.98e5,字母e以前的數字稱爲尾數,e以後的數字稱爲指數,指數表示10次冪,尾數表示與這個冪值相乘)兩種表示方式,其中指數必須是整數(正數和負數皆可)。

浮點數也能夠採用十六進制來表示!

#include <float.h> //引入小數的極限值頭文件 #include <stdio.h>//引入標準輸入輸出頭文件 /* 浮點數的兩種表示方法以及浮點數表示的極限值 @author Tony 18601767221@163.com @since 20160525 14:15 */ void float_double_info() { float fl = 10.5; //賦值會進行類型轉換操做,10.5默認是double類型 printf("fl=%.2f\n",fl); //%f 用於匹配浮點數格式 %.2f 表示小數點後保留兩位,默認保留後六位 double value = 12.0e10; //採用科學記數法的形式表示浮點數 指數只能是整數 printf("\nvalue=%.1f\n",value); double d_max_value = DBL_MAX; double d_min_value = DBL_MIN; printf("\n double所能存儲的最大值爲%e\n\n所能存儲的最小值爲%e\n",d_max_value,d_min_value); double db_value = -12.0; printf("db_value %f",db_value); } void main() { float_double_info(); getchar(); }

浮點數的極限值存放在float.h頭文件中,開發中儘可能使用double 
浮點數的極限值

使用算術運算結合C語言庫函數實現計算中國GDP什麼時候超過美國GDP

#include <stdio.h> #include <Windows.h> #include <math.h> /* 計算中國GDP什麼時候超過美國GDP @author Tony 18601767221@163.com @since 20160525 15:55 */ void calc_gdp() { //目前中國GDP約爲12萬美金 年增加率爲6.5%,美國GDP約爲18萬美金,年增加率爲3% 求哪一年中國的GDP能夠超過美國 //定義變量保存中美當前的GDP double ch = 110000.0; double am = 180000.0; //定義變量保存中美當前的年增加率 double chd = 1.07; //1.07至關於一年的增加率 而10年的增加率能夠經過math頭文件的pow(1.07,10)函數獲取 double amd = 1.03; //定義變量保存年份 int this_year = 2015; for (int i = 1; i <= 50;i++) { double ch_value = ch*pow(chd, i);//計算中國每一年增加6.5%後的GDP double am_value = am*pow(amd, i);//計算美國每一年增加3%後的GDP if (ch_value>am_value) { this_year += i; printf("%d年中國GDP超越美國:中國的GDP爲%f\t美國的GDP爲%f\n",this_year,ch_value,am_value); MessageBoxA(0, "中國GDP超過美國","恭喜",0); break; } } }

給定三條邊長,計算三角形面積

三角形面積公式爲:

P=(a+b+c)/2 
S=p*(p-a)(p-b)(p-c) 
其中a b c表示三角形的三條邊長

#define _CRT_SECURE_NO_WARNINGS//關閉VS2015的安全檢查 #include <stdio.h> #include <float.h> #include <Windows.h> #include <math.h> /* 實現計算三角形的面積 @author Tony 18601767221@163.com @since 20160525 16:10 */ double calc_area(double one, double two, double three) { double p = (one + two + three) / 2; double area = sqrt(p*(p - one)*(p - two)*(p - three)); return area; } /* 根據指定的邊長實現計算三角形的面積 @author Tony 18601767221@163.com @since 20160525 16:17 */ void calc_triangel() { //初始化三角形的三條邊 double one = 0.0; double two = 0.0; double three = 0.0; //讀取輸入的三條邊長存儲到三個double變量中 printf("請輸入三角形的第一條邊\n", &one); scanf("%lf", &one); printf("請輸入三角形的第二條邊\n", &two); scanf(" %lf", &two); printf("請輸入三角形的第三條邊\n", &three); scanf("%lf", &three); double area = calc_area(one, two, three); printf("三角形的面積爲%.2lf\n", area); system("pause"); //等待輸入任意字符退出程序 }

6.3 字符

字符型主要是用於表示單個字母,數字和符號以及轉義字符,C語言中的字符型使用char表示,表示一個字節的空間,也就意味着能夠存儲8個bit所能表示的整數(256)。char在內存中有符號(singed)最大值爲7f,無符號最大整數值爲ff。若是把一個字符當整數輸出,輸出的是這個字符的ASC||碼錶的值。

C語言提供了兩種輸出字符的方式:分別是putchar()和printf(「%c」)

#include <stdio.h> #include <stdlib.h> /* 輸出字符的兩種方式 @author Tony 18601767221@163.com @since 20160525 16:55 */ void output_char() { char c = 'A'; //聲明初始化一個字符變量並賦值爲A putchar(c); //使用putchar()函數實現字符內容的輸出 printf("\n c=%c",c);//使用printf函數輸出字符 }

在C語言中,一個字符變量佔據一個字節,可是爲了考慮兼容性,一個字符常量佔據4個字節(以無符號整數的方式存儲),而爲了表示中文,採用寬字符(wchar_t)來存儲,佔據兩個字節。

/* 字符的大小 @author Tony 18601767221@163.com @since 20160525 17:05 */ void char_size_info() { char ch = 'A'; //字符佔據1個字節 wchar_t wch = L'我'; //表示中文用寬字符,通常是以L開頭,寬字符佔據兩個字節(百度服務器對中文檢索會用到寬字符) printf("%d\t%d\t%d\n", sizeof(ch), sizeof('A'), sizeof(wch));// 字符常量'A'佔據4個字節 }

C語言中的字符串默認是以’\0’結尾,英文字符串中的英文字符佔據一個字節,中文字符串中的中文字符佔據兩個字節。

/* 英文和中文字符串佔據的大小 @author Tony 18601767221@163.com @since 20160525 17:09 */ void string_size() { printf("空字符串佔據的字節數量爲%d \n", sizeof(""));//C語言的字符串以'\0'字符結尾 空字符串會佔據一個字節 printf("英文字符串\"ABCDEF\"佔據的字節數量爲%d \n",sizeof("ABCDEF")); //英文字符串中的一個字符佔據一個字節,而整個字符串的字節數量會在字節的數量上加1 printf("中文字符串\"萬般皆下品惟有讀書高\"佔據的字節數量爲%d\n",sizeof("萬般皆下品惟有讀書高"));//中文字符串中的漢字佔據兩個字節 }

ASC||碼錶規定了字符和數字的映射關係,每一個字符都能找到對應的整數編號:

/*
    ASC||碼錶 :字符和數字的映射關係,每一個字符都有一個整數編號 '\0'的編號是0 @author Tony 18601767221@163.com @since 20160525 17:09 */ void asc_char_num() { char charA = 'A'; //ASC||碼錶中規定了大寫字符A對應的數字是65 printf("charA=%d\n",charA); printf("charA=%c\n", charA); char chara = 'a';//ASC||碼錶中規定了小寫字符A對應的數字是97 printf("chara=%d\n", chara); printf("chara=%c\n", chara); char charZero = '0';//ASC||碼錶中規定了字符0對應的數字是48 printf("charZero=%d\n", charZero); printf("charZero=%c\n", charZero); }

經過ASC||碼錶規定的字符對應的整數編號實現大小寫字符替換

/*
    字母的大小寫轉換
    @author Tony 18601767221@163.com @since 20160525 17:54 */ void upper_lower() { printf("請輸入一個字母\n"); char content = getchar(); if (content>=65&&content<97) { char lower = content + 0x20; printf("你輸入的是大寫字母%c,轉換爲小寫的結果爲%c\n",content, lower); } else if (content>=97&& content <=123) { char upper = content - 0x20; printf("你輸入的是小寫字母%c,轉換爲大寫的結果爲%c\n", content, upper); } }

6.4 寬字符

6.5 _Bool類型

_Bool類型是C99(ISO組織發佈的C語言標準)後新增的一個數據類型,用於存儲經常使用的關係運算符,邏輯運算符,三目運算符的運算結果(運算結果一般都是真或者假),_Bool類型的取值結果只能爲true和false,佔據1個字節的大小。

#include <stdio.h> #include <stdbool.h> void main() { _Bool bl = false; //非0 表示true 0表示false printf("_Bool佔據的字節數量爲%d\n", sizeof(bl)); bl ? printf("天氣很好") : printf("天氣很壞"); getchar(); }

7 數據類型轉換

整數,浮點數和字符在進行混合運算時會發生自動類型轉換,默認的轉換規則是自動將低字節的變量類型轉換爲高字節的變量類型,例如char自動提高爲int,這樣保證了計算結果的正確,確保數據精度不溢出。

#include <stdio.h> /* 數據類型的自動轉換 @author Tony 18601767221@163.com @since 20160525 22:53 */ void auto_convert() { //自動數據類型轉換 在執行算術運算時:小數據類型會轉換成大數據類型,保證計算的精度不會形成溢出 char ch = 'A'; printf("%d\n", sizeof(ch)); printf("%d\n", sizeof(ch + 1));//1默認是int 整個結果自動類型轉換成int printf("%.2f",50.0-12+'a');//多個數據參與運算時結果的數據類型是參與計算的最大的數據類型 } 

可是生活中也存在着對數據」取整」的要求,例如銀行賬戶的餘額等等,這時就須要使用到強制類型轉換來實現。

#include <stdio.h> /* 數據類型的強制轉換 @author Tony 18601767221@163.com @since 20160525 22:59 */ void force_convert() { //強制類型轉換 printf("%d", (int)12.8); //在數據類型前面加上(強制轉換的類型便可) printf("\n%f", (float)10); //定義兩個變量 float fl = 10.3; float ff = 10.8; int sum = (int)fl + ff; printf("\nsum=%d\n",sum); //20 sum = (int)(fl + ff);//21 printf("sum=%d\n", sum); }

經過強制類型轉換和算術運算實現對銀行賬戶金額的分實現四捨五入處理:

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> /* 經過強制類型轉換實現對帳戶餘額的分進行四捨五入處理 @author Tony 18601767221@163.com @since 20160525 23:08 */ void getmoney() { double balance = 0.0; //初始化帳戶餘額 printf("請輸入你當前的帳戶餘額\n"); scanf("%lf",&balance); double res = (int)(balance * 10 + 0.5) / 10.0; if (res<balance) { printf("帳戶餘額的分小於5分能夠執行轉帳,轉帳的金額爲%f\n元",balance-res); } else { printf("帳戶餘額的分大於等於5分,不能執行轉帳操做,帳戶的餘額爲%.2f\n",balance); } }

在將高字節的值強制轉換爲低字節變量類型時,可能會形成數據精度溢出的緣由是什麼呢?

首先必須明確高字節(這裏以int爲例)和低字節(這裏以short爲例)在內存中存儲的機制。

#include <stdio.h> /* 數據類型溢出的原理 @author Tony 18601767221@163.com @since 20160525 12:08 */ void convert_error() { int intVal = 256; //初始化一個整數變量 char charVal = (int)intVal; //將int強轉爲char後進行賦值 printf("charVal=%d\n",charVal);//輸出結果爲0 }

下面分析下緣由:

char所能表示的取值範圍是0-255之間的256個數字,轉換爲二進制表示就是0000 0000 -1111 1111之間的數字。 
256的二進制表現形式爲1 0000 0000,所以超過了char所能存儲的數據範圍,只能截取0000 0000,因此結果就是0了。

歡迎掃描下方的二維碼,關注微信公衆服務號-藝無止境,分享IT技術乾貨。 
藝無止境

相關文章
相關標籤/搜索