機(jī)器數(shù)审胚,真值恕沫,原碼强重,補(bǔ)碼和反碼
1. 機(jī)器數(shù)和真值
計(jì)算機(jī)常用最高位表示一個(gè)有符號(hào)數(shù)的正負(fù)绞呈,例如-1
的機(jī)器數(shù)為10000001
(字長(zhǎng)8bit)贸人。10000001
的真值就是-1
而不是129
。
2. 原碼佃声,補(bǔ)碼和反碼
[+1] = [00000001]原 = [00000001]反 = [00000001]補(bǔ)
[ -1] = [10000001]原 = [11111110]反 = [1111 1111]補(bǔ)
原理待補(bǔ)充
變量
類型限定詞 const 和 volatile
八進(jìn)制數(shù)以0開(kāi)頭 十六進(jìn)制數(shù)以0x或者0X開(kāi)頭艺智。
整型常量后綴分為無(wú)符號(hào)型后綴(u或者U)和長(zhǎng)型后綴(l或者L)兩類,兩個(gè)l可以表示long long圾亏。
c語(yǔ)言中十拣,浮點(diǎn)數(shù)只采用十進(jìn)制。
浮點(diǎn)數(shù)常量的兩種表示形式:小數(shù)形式和指數(shù)形式
%f
輸出小數(shù)形式:小數(shù)點(diǎn)常量必須要有.
志鹃。.
前或者.
后面至少要有一邊又?jǐn)?shù)字夭问,即12.
和.12
都是允許的。
%e
或%E
輸出指數(shù)形式:e
后面的數(shù)必須為整數(shù)弄跌。
浮點(diǎn)常量默認(rèn)都bouble類型,加上后綴l
表示long double尝苇,后綴f
表示float
%g
輸出%f
和%e
中寬度較短的那個(gè)
'\N'
和 '\xN'
\N表示八進(jìn)制值為N的ASCII字符
\xN表示十六進(jìn)制值為N的ASCII字符
例如\116
和\x4e
都表示字符N
'a'占一個(gè)byte铛只,"a"占兩個(gè)byte
計(jì)算誤差
上溢(超出可表示范圍)
下溢(浮點(diǎn)數(shù))
可表示誤差(計(jì)算機(jī)無(wú)法計(jì)算無(wú)限位數(shù)導(dǎo)致的誤差)
浮點(diǎn)數(shù)
可表示誤差:float保證7位有效,double保證14位有效糠溜。(包含整數(shù)部分)
上溢:
#include<stdio.h>
int main(){
float a = 1.;
for(int i=1; i<=35; i++){
a *= i;
printf("%g\n", a);
}
return 0;
}
在這種情況下淳玩,最后一條輸出是1.#INF
,把a(bǔ)的類型從float改成double的話i的最大值可以取到171才會(huì)再出現(xiàn)1.#INF
非竿。
下溢:
#include<stdio.h>
int main(){
float a = 1.;
for(int i=1; i<=47; i++){
a /= 10;
printf("%g\n", a);
}
return 0;
}
符號(hào)位擴(kuò)展
強(qiáng)制類型轉(zhuǎn)換時(shí)遵守轉(zhuǎn)換前后值相等蜕着。
char c = '\376';
short int a = c;
運(yùn)算符優(yōu)先
單目運(yùn)算符,賦值運(yùn)算符和條件(三目)運(yùn)算符是從右往做結(jié)合的红柱。
因此表達(dá)式a+=a-=4
先計(jì)算a-=4
再計(jì)算a+=
程序
1. goto
語(yǔ)句
goto
語(yǔ)句是無(wú)條件跳轉(zhuǎn)語(yǔ)句承匣,格式:
goto lable; /*lable為語(yǔ)句標(biāo)號(hào)*/
/* statements */
lable: statements;
2.fflush(stdin)
清空標(biāo)準(zhǔn)流緩沖區(qū)
3. getch()
和getche()
使用他們必須包含控制臺(tái)輸入輸出庫(kù)函數(shù)# include<conio.h>
中,無(wú)緩沖模式 ,其中gethce()
是get character and echo的縮寫锤悄,一輸入就立刻回顯到屏幕上韧骗。
4.輸出
類型 | 效果 |
---|---|
%o 和%x 和%X
|
八進(jìn)制 十六進(jìn)制(字母大小寫的區(qū)別) |
%h |
short型 |
%l 和%u
|
長(zhǎng)型 無(wú)符號(hào)型 |
%a.bf |
最小寬域a,精度b的float型 |
%a.bs |
最小寬域a零聚,最多輸入b個(gè)字符的字符串 |
%n |
不輸出袍暴,把已打印的字符個(gè)數(shù)存到變量(范例如下) |
int a;
char s[] = "astring";
printf("%s%n", s, &a);
printf("%d", a); //輸出為7
return 0;
5.輸入
類型 | 效果 |
---|---|
%o 和%x 和%X
|
八進(jìn)制 十六進(jìn)制(字母大小寫的區(qū)別) |
%p |
讀入一個(gè)指針 |
%u |
無(wú)符號(hào)型 |
%<字符串>d |
控制串中的非空白字符,輸入時(shí)必須要打這串字符串 |
%as |
域長(zhǎng)說(shuō)明符隶症,最多讀入a為字符串 |
%*c |
忽略這項(xiàng)輸入 |
%n |
把已讀入的字符個(gè)數(shù)存到變量 |
%[字符串] |
掃描合集政模,輸入掃描合計(jì)中的字符。 |
6.標(biāo)識(shí)符作用域和可視化和存儲(chǔ)類別
標(biāo)識(shí)符的儲(chǔ)存類別決定它的儲(chǔ)存周期和鏈接蚂会。
儲(chǔ)存周期
- 自動(dòng)存儲(chǔ)器: 局部變量的缺省存儲(chǔ)類別淋样。程序塊運(yùn)行結(jié)束后所分配的內(nèi)存單元被釋放收回,再次進(jìn)入時(shí)重新分配胁住。
- 靜態(tài)存儲(chǔ)器: 在程序結(jié)束前一直存在习蓬,但是能否訪問(wèn)則受到作用域的限制纽什。靜態(tài)存儲(chǔ)器變量初始值被系統(tǒng)自動(dòng)定義為0。
鏈接
針對(duì)多源文件程序而言躲叼。包括:
- 外部鏈接 :在構(gòu)成程序的所有文件可識(shí)別
- 內(nèi)部鏈接:在定義它的整個(gè)文件可識(shí)別
- 無(wú)鏈接:在作用域可識(shí)別
儲(chǔ)存類別
- auto (自動(dòng)存儲(chǔ)器)
顯示地聲明具有自動(dòng)存儲(chǔ)器的變量芦缰。由于局部變量在沒(méi)有聲明任何存儲(chǔ)類別情況下,默認(rèn)為自動(dòng)變量枫慷,所以可以刪除關(guān)鍵字auto让蕾。 - register (自動(dòng)存儲(chǔ)器)
即寄存器變量,寄存器變量必須是自動(dòng)變量或听,也就是說(shuō)該關(guān)鍵詞只能在局部變量和形參之前探孝。寄存器處理比內(nèi)存快,但空間有限誉裆。 - static (靜態(tài)存儲(chǔ)器)
static對(duì)于局部變量和全局變量的處理方法不同顿颅。
1)靜態(tài)局部變量
理解:“靜態(tài)”意味著具有全局存儲(chǔ)周期,“局部”意味著只有在作用域具有可視性足丢,靜態(tài)存儲(chǔ)器變量被系統(tǒng)初始化為零
以下代碼輸出為1234粱腻。如果去掉static則輸出1111。
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
void increase();
int main(){
increase();
increase();
increase();
increase();
system("pause");
return 0;
}
void increase(){
static int a;
printf("%d", ++a);
}
2)全局變量
由于全局變量本身就具有靜態(tài)存儲(chǔ)期斩跌,再用static修飾它是將他設(shè)置為內(nèi)部鏈接绍些,即只能在本文件內(nèi)訪問(wèn)它。
- extern (靜態(tài)存儲(chǔ)器)
主要是聲明程序其他地方用外部鏈接定義的對(duì)象耀鸦,即必須是全局變量柬批,因?yàn)槿肿兞坎啪哂型獠挎溄印S胑xtern聲明的對(duì)象要么在程序后面定義要么在其他文件中定義
編譯預(yù)處理
- 宏(注意括號(hào)的運(yùn)用)
1)不帶參數(shù)的宏
#define 宏名字 <宏體>
源程序中只有與宏名字相同的標(biāo)識(shí)符才被替換
例如以下程序輸出為
PI = 3.140000
#define PI 3.14
printf("PI = %f", PI);
system("pause");
return 0;
2)類函數(shù)宏
#define 宏名字(參數(shù)表) <宏體>
3)取消定義宏
#undef 宏名字
算法的描述
- 程序流程圖
- NS盒圖
- PAD圖
- 偽代碼
數(shù)組和字符串
- 通過(guò)scanf("%ns", s)控制輸入字符串字符最大數(shù)量袖订。
字符串函數(shù)#include <string.h>
- strcpy(str1, str2)
1.5 strncpy(str1, str2, n) - strcat(str1, str2)
- strlen(str)
- strcmp(str1, str2)
二維數(shù)組的初始化
int a[3][3] = {
{1, 2}, {4, 5, 6}, {7, 8, 9}
}; // 初始按順序是 1 2 0 4 5 6 7 8 9
int a[3][3] = {
{1, 2, 3}, {4, 5, 6, 7}, {7, 8}
};// 會(huì)報(bào)錯(cuò),程序無(wú)法運(yùn)行
第一維可以省略氮帐,第二維不能省略
指針
1. 動(dòng)態(tài)分配函數(shù)
1)void *malloc(size_t size)
用法案例:
int *p;
p = (int *)malloc(10*sizeof(int));
if(!p){
printf("false to malloc!");
exit(1);
}
2)free()
注意不要對(duì)無(wú)效指針調(diào)用free(),否則會(huì)破壞自由表
指針可以比較大小洛姑,但必須種類相同且對(duì)象相同比如同一個(gè)數(shù)組
關(guān)于多級(jí)指針和數(shù)組的理解
s是二維數(shù)組揪漩,數(shù)組名s是指向數(shù)組的指針,因此只能用數(shù)組指針pt1賦值吏口。
a是指針數(shù)組奄容,數(shù)組名a是指向指針的指針,因此只能用二級(jí)指針pt2賦值产徊。
思考一下a+1和s+1的區(qū)別就能明白為啥不能劃等號(hào)了