今天介绍一下原码,反码,补码
首先来个例子
#include<stdio.h>
int main()
{
int a = 0; // 4个字节 32 bit
int b =~a; // ‘~’按位取反(b在这里就是有符号的整型)
// eg 1 0 1 0 → 0 1 0 1 ---- 按位(二进制位)取反
printf("%d\n",b); // 使用的,打印的是这个数的原码
return 0;
}
负数在内存中存储负的时候,存储的是二进制的补码
二进制中最高位表示的是符号位,有符号的整型是最高位指的是符号位
原码 : 直接按照正负写出的二进制序列
原,反, 补 计算规则
原→反→补
原码符号位不变,其它位按位取反得反,反加1得补码
补→反→原
补码减1得反码,反按位去反得原码
eg:
1 1 1 1 1 1 1 1 补
1 1 1 1 1 1 1 0 反
1 0 0 0 0 0 0 1 原
ps:此处原码中第一个1 代表符号‘-’,最后一个1 就是1 所以就是-1
注意:任何整数数字在内存中存得都是补码(二进制
正数----原,反,补相同
负数----原→反→补
反码只是一个计算得中间状态
int main()
{
int a= 10;
int b = a++;/ / 后置++,先使用在++
printf("a=%d, b=%d\n",a,b);
return 0;
}
int b = ++a; / /前置++,先自增在使用
有符号数
int a = 10; - - -int 定义得变量是有符号数 原signed int
无符号数 ---不存在正负之分, 永远都是正数,即使是负数
unsigned int num = 0;(无符号整型
struct 结构体关键字 union 联合体/公用体 volatile(这个关键字比较复杂
** 自己定义得符号名不能与关键字冲突
typedf 类型定义--类型重定义
typedf unsignede int u_int;
u_int num2 = 20; 与 unsigned int num =0;(无区别 ,变量类型是一样得
static 修饰变量和函数得
#include<stdio.h>
void test()
{
int a = 1;
a++;
printf("a=%d\n",a);}
int main()
{
int i =0;
while(i<5)
{
test()
i++;
return 0;}
}
此时函数出去了之后a就不在了,局部变量生命周期结束了,不会延用到下一次循环
但是如果有static修饰的话,a就被积累下来了并且没有被销毁
static int a= 1; / /a 是一个静态得局部变量
并且a进入范围之后还会存在,且出了范围之后也没有被销毁
static 修饰局部变量,局部变量的生命周期变长
修饰全局变量,改变了全局变量的作用域,让静态的全局变量只能在自己所在的源文件内部使用,离开源文件就无法使用
——————全局变量只要在其他源文件内部进行外部申明是可以使用的