標籤:
2015.1.20
//十進位
//0 1 2 3 4 5 6 7 8 9 10 11 12 .... 99 100 101 ...
//進位: "逢十進一"
//二進位(對於電腦是最自然的語言)
//0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111
//"逢2進1"
//高電平: 1 低電平 0
//5+6
//機器語言
//0101001010101010
//0101001010101001
//1010101010100110
//組合語言
//5+6
//movl $5 %-8(rbp)
//movl $6 %-12(rbp)
//movl %-8(rbp) %eax
//addl %-12(rbp) %eax
//movl %eax %esi
//可移植性差
//5+6 c99
//int a = 5;
//int b = 6;
//int c = a+b;
//簡潔 , 可移植性強, 健壯性
//編譯器:C語言 -- > 組合語言 --> 二進位語言
//OC語言 --> C語言 --> 組合語言 --> 二進位語言
//123 = 1*10^2 + 2*10^1 + 3*10^0
//除10倒序取餘數
//123 / 10 -- 3
//12 / 10 -- 2
//1 / 10 -- 1
//123
//十進位轉二進位
//除2倒序取餘數
//123
//123 / 2 -- 1
//61 / 2 -- 1
//30 / 2 -- 0
//15 / 2 -- 1
//7 / 2 -- 1
//3 / 2 -- 1
//1 / 2 -- 1
//0 / 2 -- 0
//0
//123 = 0b1111011 = 1 *2^0 + 1*2^1 + 0*2^2 + 1*2^3 + 1*2^4 + 1*2^5 + 1*2^6 = 1 + 2 + 0 + 8 + 16 + 32 + 64 = 123
//表示位元在資料的前面加0b 0b1010101001 0b11111
//345 678 987
/*int main(int argc,const char *argv[])
{
int bin[32]={};
int num;
scanf("%d", &num);//小寫鍵盤Enter鍵不能使用
//%d 整型資料格式化預留位置
int i=0;
while (num) {//num = 0
bin[i]= num%2;
num/=2;//改變num的值
i++;
}
printf("0b");
for (i=i-1; i>=0 ; i--) {
printf("%d", bin[i]);
}
printf("\n");
return 0;
}*/
//八進位
//0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20 ...
//逢8進1
//八進位在前面加0表示八位元
//010
//資料的大小不因為進位的表現形式而改變
//int main(int argc, const char *argv[])
//{
// int a = 10;
// int b = 0b1010;
// int c = 012;
// int d = 0xa;
//
// printf("a = %d b = %d c = %d d = %d\n", a, b, c, d);
//
// return 0;
//}
//十進位數轉八位元
//除8倒序取餘數
//123
//123 / 8 --- 3
//15 / 8 --- 7
//1 / 8 --- 1
//0
//123 = 0173 = 3*8^0 + 7*8^1 + 1*8^2 = 3 + 56 + 64 = 123
//233 156 78
//int main(int argc,const char *argv[])
//{
// int num ;
// scanf("%d", &num);
// printf("0%o\n", num);//%o 八位元預留位置
// return 0;
//}
//八進位轉二進位
//"421"
// 0 1 2 3 4 5 6 7
//000 001 010 011 100 101 110 111
//0173 = 0b1111011
//把八位元中每一位, 分別用三位位元替換
//04567 0765 01234
//0b100 101 110 111
//0b111 110 101
//0b001 010 011 100
//位元轉八位元
//0b 011 110 001 101 011 110 000 110
//036153606
//從低位開始, 每三位為一組, 高位不足三位補0, 用八位元替換三位位元
//十六進位
//逢十六進一
//0 1 2 3 4 5 6 7 8 9 a/A b/B c/C d/D e/E f/F
//10 11 12 13 .... 1f ...20 ...ff ...100 ...101
//首碼0x說明一個十六進位數 0x100
//十進位數轉十六進位數
//除十六倒序取餘數
//123
//123 / 16 -- b
//7 / 16 -- 7
//0
//123 = 0x7b = b*16^0 + 7*16^1 = 11+112 = 123;
//十六進位轉二進位
//分別用4位位元替換每一位十六進位數
//"8421"
//0 1 2 3 4 5 6 7 8
//0000 0001 0010 0011 0100 0101 0110 0111 1000
//9 a b c d e f
//1001 1010 1011 1100 1101 1110 1111
//0x2345678 = 0b10001101000101011001111000
//0xfeabc9876543210 = 0b1111 1110 1010 1011 1100 1001 1000 0111 0110 0101 0100 0011 0010 0001 0000
//二進位轉十六進位
//從低位開始, 每四位為一組, 高位不足四位補0, 分別用十六進位數替換四位位元
//0b0101 1101 0110 1010 1111 0001 1110 1100
//0x5d6af1ec
//對於一個很大的數轉換成二進位,用八進位或者十六進位進行過度
//345678908765
//電腦中的單位
//電腦中最小的單位是二進位位 1bit
//八個二進位位 組成一個位元組 1Byte = 8bits
//1Kb = 1024Bytes
//1Mb = 1024Kb
//1Gb = 1024Mb
//1Tb = 1024Gb
//1Pb = 1024Tb
//硬碟廠商
//500Gb = 500*1000Mb = 500 * 1000Mb *1000Kb = 500 *1000Mb *1000Kb *1000Byte
//int main(int argc, const char * argv[]) {
//
//
// printf("hello world\n");
//
// return 0;
//}
//資料在電腦中儲存形式
//記憶體: RAM ROM
//由二進位位電路組成
//資料編碼方式
//以8bits為例 char
//以最高位作為符號位, 其餘位表示資料的大小
//最高位為1 說明是一個負數, 最高位為0 說明是一個正數
//原碼: 最高位為符號位, 其餘位表示資料的絕對值大小
//-6 1000 0110
//6+5
// 00000110 6
// 00000101 5
//-------------------
// 00001011 = 11
//6+(-5)
// 0000 0110
// 1000 0101
//-----------------
// 1000 1011(原碼) = -11
//原碼不能進行減法運算, 原因是符號位也參與了運算
//反碼: 正數的反碼就是它的原碼, 負數的反碼,是在原碼的基礎上,符號位不變,其餘位按位取反
//7 原碼: 0000 0111 反碼: 0000 0111
//-7 原碼: 1000 0111 反碼: 1111 1000
//-5 原碼: 1000 0101 反碼; 1111 1010
//-9 原碼: 1000 1001 反碼: 1111 0110
//-12 原碼: 1000 1100 反碼: 1111 0011
//6+(-5)
// 0000 0110
// + 1111 1010
//----------------
// 0000 0000(反碼) = 0
//-5+(-6)
// 1111 1010
//+ 1111 1001
//-----------------
// 1111 0011(反碼) ==> 1000 1100 ==> -12
//反碼轉原碼: 再求一次反碼
//0 的表示不唯一
//+0 0000 0000
//-0 1000 0000
//反碼不能儲存資料的原因就是0的表示不唯一
//補碼: 正數的補碼就是它的原碼 負數的補碼,是在反碼的基礎上加1
//6 : 0000 0110(補碼)
//-6 : 1000 0110 --> 1111 1001 --> 1111 1010(補碼)
//-5 : 1000 0101 --> 1111 1010 --> 1111 1011(補碼)
// -6 + (-5)
// 1111 1010
// 1111 1011
//---------------
// 1111 0101(補碼) --> 1000 1010 --> 1000 1011(原碼) = -11
//補碼轉原碼: 正數不變, 對於負數, 符號位不變, 其餘位按位取反加1
//電腦中採用補碼的方式儲存資料
//-12 原碼: 1000 1100 反碼: 1111 0011 補碼: 1111 0100
//-34 原碼: 1010 0010 反碼: 1101 1101 補碼: 1101 1110
//-128 原碼: 11000 0000 反碼: 10111 1111 補碼: 1000 0000
//規定: 1後面跟7個0就是當前範圍內最小的數 1即表示符號位,又表示絕對值大小
//-127 原碼: 1111 1111 反碼: 1000 0000 補碼: 1000 0001
//-0 原碼: 1000 0000 反碼: 1111 1111 補碼: 0000 0000
//+0 0000 0000
//-128 ~~~ 127
//0x80 ~~ 0x7f
//16二進位位
//1000 0000 0000 0000 ~~~ 0111 1111 1111 1111
//0x8000 ~~~ 0x7fff
//資料類型
//整型
//有符號
//64位平台
//char short int long long long
//1byte 2bytes 4bytes 8bytes 8bytes
//32位平台
//1byte 2bytes 4bytes 4bytes 8bytes
//無符號
//unsigned char 0x00 ~~~ 0xff
//unsigned int 0x00000000 ~~~ 0xffffffff
//unsigned short 0x0000 ~~~ 0xffff
//unsigned long 0x0000000000000000 ~~~ 0xffffffffffffffff
//unsigned long long 0x0000000000000000 ~~~ 0xffffffffffffffff
/*int main(int argc, const char *argv[])
{
//int a;
printf("char = %lu\n", sizeof(char));//sizeof運算子 求資料類型,或者變數佔用記憶體空間大小
// char a= 0x80, b = 0x7f;
// printf("char %d ~~~ %d\n", a, b);
printf("unsigned char = %ld\n", sizeof(unsigned char));
//0 ~~ 255
// unsigned char a= 0x00, b = 0xff;
// printf("char %d ~~~ %d\n", a, b);
// short a =0x8000, b = 0x7fff;
// printf("short %d ~~~ %d\n", a, b);
// printf("short = %lu\n", sizeof(short));
// int a = 0x80000000, b = 0x7fffffff;
// printf("int %d ~~~ %d\n", a, b);
printf("int = %lu\n", sizeof(int));
long a= 0x8000000000000000, b= 0x7fffffffffffffff;
printf("long %ld ~~~ %ld\n" , a, b);
printf("long = %lu\n", sizeof(long));
printf("long long = %lu\n", sizeof(long long));
return 0;
}
*/
//%d : char short int
//%ld : long
//%lld: long long
//%u: unsigned char unsigned short unsigned int
//%lu: unsigned long
//%llu: unsigned long long
//%x: 列印十六進位
//%o: 列印八進位
//int main(int argc,const char *argv[])
//{
// long long a=789;
// printf("a = %lld", a);
//
// unsigned int b=12;
// printf("%u", b);
//
// return 0;
//}
//浮點類型
//單精確度 雙精確度 長雙精確度
//float double long double
//4位元組 8位元組 16位元組
//int main(int argc, const char *argv[])
//{
// printf("float = %lu\n", sizeof(float));
// printf("double = %lu\n", sizeof(double));
// printf("long double = %lu\n", sizeof(long double));
//
// return 0;
//}
//浮點類型資料表示
//3.14
//科學計數法: 5678.678 5.678678 * 10^3;(不能在電腦中表示)
//指數法: 34.56 ==> 3.456e1
//int main(int argc,const char *argv[])
//{
// float f1 = 3.14;//常用方式
// printf("%f\n", f1);
// float f2 = 3.456e1;//指數法
// printf("%f\n", f2);
// float f3 = 3.45e-2;
// printf("%f\n", f3);
//
// return 0;
//}
//浮點類型資料在記憶體中儲存形式
//3.145 --> 0.3145e1
//-32.56 -->-0.3256e2
//1.符號位 2.小數位 3. 指數位
//float 精度 6~7位
//double 精度 15~16位
int main(int argc,const char *argv[])
{
float f1 = 567.2345434532345345;
printf("%f\n", f1);//%f
double f2 = 6798.34567876543234567876;
printf("%.20f\n", f2);//%lf %f
long double f3 = 34567.345678987654345678987654;
printf("%Lf\n", f3);//%Lf
return 0;
}
IOS-C_Day2___進位編碼