两个数的交换
1.引入第三者。 2.求和运算,求差。(这样会产生内存溢出) 3.异或运算
a = a^b;
b = a^b;
a = a^b;
8b(bit位) = 1B(Byte=字节)//最小单位是字节
32位机:232 = 4G寻址能力
(王爽--统一编址,汇编语言)
char类型一个字节,8位。[-128,127],28=256种,
why?[-128,127];深层的编码采用补码,1,表示负数。
正常的:
0000 0000 1
0000 0001 2
0111 1111 127
...
1000 0000 -0
...
1111 1111 -127
这样1+-1=-2; 补码规则:
0000 0000 0
0000 0001 1
0111 1111 127
...
1000 0000 -128
-127
...
1111 1111 -1
计算机只会做加法,1+-1=0;0000 0001 + 1111 1111= 0000 0000;高位溢出得0;
#include<stdio.h>
int main() {
char a = 0;
disBin(a);
char b = 1;
disBin(b);
char c = 2;
disBin(c);
char d = 127;
disBin(d);
char e = -128;
disBin(e);
char f = -2;
disBin(f);
char g = -1;
disBin(g);
}
//打印一个数的二进制
void disBin(char ch) {
int i = 8;
while(i--) {
if((1<<i) & ch) {
printf("1");
}else {
printf("0");
}
if(i%4 == 0) {
printf(" ");
}
}
putchar(10);
}
补码的出现所有的乘法,除法,减法,都用减法实现。 补码的规则:(运算互为逆运算) 所有的整数的补码是他本身,所有的负数,取绝对值后取反,加一。 逆过程的运算,最高位是1,是负数。全部参与运算取反加一。 0的补码是0; 补码的运算相当于12进制的时钟,其中顺时针为正,逆时针为负。例如:当前时钟在3点,要点到8点。可以顺时针一可以逆时针。3+5=8,(3+12)-7=8;中的12溢出,在这之中相加互为12的称之为“补数”。 计算机中的所有减法,乘法,除法都可有加法计算。 1-2=1+(-2),也就是相当于1加上-2的补码。 注意:一个8位的空间,如果用来表示无符号数0-255(0-28-1),如果表示有符号的数:-128-127(-27-2^7-1)。
sizeof();
sizeof(char);//1字节
sizeof(short);//2字节
sizeof(int);//4字节
sizeof(long);//4字节
sizeof(long long);//8字节
1字节 char
0 - 255 unsigned char(无符号) 0 -2^8-1
-128 - 127 signed char -2^7 -2^7-1
2字节 short
0 - 65535 0 - 2^16-1
-32768 - 32767 -2^15 - 2^15-1
4字节 int
0 - 2^32(40亿)
-2^31 - 2^31-1
long(4个字节)没有扩展,
long long(8个字节)。
0 - 2^64
-2^62 - 2^63-1
int 基本整型 理想的32位机,地址总线和数据总线都是32位的。
有效数字,从左至右不为0的数字。超出类型的限制之后的数字不保证正确。 float,doouble;