-------------------学习笔记
1.基本数据类型大小
c语言:
基本数据类型大小/(byte) | 32位系统 | 64位系统 |
char | 1 | 1 |
short | 2 | 2 |
int | 4 | 8 |
long | 4 | 8 |
float | 4 | 4 |
double | 8 | 8 |
各种指针类型 | 4 | 8 |
ps:
example:
int类型
32bit
最大值: 2^31-1
最小值:-2^31-1
还有一位存储符号
00000000 00000000 00000000 00000000
(二进制)
红色代表符号位
2.原码、反码、补码
有符号符号的数据类型:
原码:
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值.
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值.
原码是人脑最容易理解的表示。
反码:
正数的反码是其本身
负数的反码:符号位不变,其余各个位的值取反。
[10000001] 原码
[11111110] 反码
补码:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
-1 [10000001] 原码
[11111110] 反码
补码 + 1 = [11111111] 补码
3.隐式转换 :
C语言规定的转换规则是由低级向高级转换。
例如,如果一个操作符带有两个类型不同的操作数时,那么在操作之前行先将较低的类型转换为较高的类型,然后进行运算,运算结果是较高的类。
注意:在表达式中,所有的float类型都转换为double型以提高运算精度。
example:
<pre name="code" class="cpp"><span style="font-size:18px;"> a = -3;
unsigned int b = 2;
long c = a + b;
printf("%ld", c);</span>
相加时 因为32位系统 与64位系统 long的大小不一样 所以情况不同
unsigned int 最大可表示2^32-1
int 最大可表示2^31-1
这样int 就会转换为 unsigned int, 由于y<0, 即y的最高符号位是1, 转换为unsigned int 后最高位不在是符号位。
(int)-3 = 10000000 00000000 00000000 00000011(原码)
11111111 11111111 11111111 11111100(反码)
11111111 11111111 11111111 11111101(补码)
a + b = 11111111 11111111 11111111 11111101 + 00000000 00000000 00000000 00000010
=
11111111 11111111 11111111 11111111
32位系统 long 4byte 所以a + b = -1 = 11111111 11111111 11111111 11111111 (补码)
64位系统 long 8byte 所以 a + b= 2^32 = 4294967295
4.位运算
1.& 按位 与
运算:对应的两个二进制 均为1时 ,结构为1, 否则为0
example: 9 & 5 = 1
1001
0101
结果:0001 = 1
example: x % 8 == x & 7
2.| 按位 或
运算:对应的两个二进制只要有一个为1时 ,结果为1, 否则为0
example: 9 | 5 = 13
1001
0101
结果:1101 = 13
3. ^ 按位 异或
运算:对应的两个二进制 不相同为 1, 否则为 0
example: 9^5 = 12
1001
0101
结果:1100 = 12
ps: 相同整数 异或为 0 5^ 5 = 0
不同整数 异或 结果和顺序无关
任何数和 0 异或 结果不变
4.~ 按位 取反
运算:对整数的 每一位取反 ,符号也要取反
example: ~9 = -10
00000000 00000000 00000000 00001001
取反111111111 111111111 111111111 111110110
求其原始数据
求其补码
10000000 00000000 00000000 00001001 = -10
5. << 左移
example: x<<n = x * 2^n
运算:把x的二进制位向左移动 n个单位, 高位丢弃, 低位补0
6. >> 右移
example: x>> n = x / 2^n
运算:把x的二进制位向右移动n个单位, 低位丢弃, 符号位不变,但是符号要跟着移动
也就是不改变正负
5.大端机器及小端机器
所谓大端就是指 高位值在内存中放低位地址,所谓小端是指低位值在内存中放低位地址。
判断机器是何种机器的小代码
<pre name="code" class="cpp"><span style="font-size:18px;">#include <iostream>
using namespace std;
union
{
int number;
char s;
}test;
bool testBigEndin()
{
test.number=0x01000002;
return (test.s==0x01);
}
int main()
{
if (testBigEndin())
cout<<"Big-Endian<<endl;
else
cout<<"litter-Endian"<<;
return 0;
}</span>