一、测试代码,!: 代表值得取反,对于整型变量,只要不为0,使用 ! 取反都是0,0取反就是1。就像 bool 只有真假一样。if语句会把有符号转成无符号,所以取反非0的有符号数都是false。
代码语言:javascript复制#include "stdio.h"
#include "stdlib.h"
/*
* 二进制数格式输出,输出所有位
* 6bit
* 011010
* 100000 1<<5
* &
* */
void print_bin(int number){
int bit = sizeof(int)*8;
int i;
for(i = bit - 1;i >= 0;i--){
int bin = (number & (1 << i)) >> i;
printf("%d", bin);
}
printf("n");
}
void print_char_bin(char number){
int bit = sizeof(char)*8;
int i;
for(i = bit - 1;i >= 0;i--){
int bin = (number & (1 << i)) >> i;
printf("%d", bin);
}
printf("n");
}
int main()
{
/*
对于一个数, 计算机要使用一定的编码方式进行存储。原码, 反码, 补码是机器存储一个具体数字的编码方式
[ 1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
1.原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值
2.反码
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反
3.补码
正数的补码就是其本身
负数的补码即是在反码的基础上 1
由此可见,正数的原码反码补码都是自身,负数的反码,补码都无法直观看出其数值,
需要转换成原码再计算其数值
-7 的原码是1000 0111,最高位是1 ,反码是1111 1000 ,补码是1111 10001
*/
char m=-7,n=7;
int i=0,j=1,k=-1;
printf("m=%urn",(unsigned char )m);
print_char_bin(m);
print_char_bin(n);
if(!i)
printf("i=%d,!i is truern",i);
else
printf("i=%d,!i is falsern",i);
if(!j)
printf("j=%d,!j is truern",j);
else
printf("j=%d,!j is falsern",j);
if(k)
printf("k=%d,k is truern",k);
else
printf("k=%d,k is falsern",k);
if(!k)
printf("k=%d,!k is truern",k);
else
printf("k=%d,!k is falsern",k);
if(!12)
printf("!12 is truern");
else
printf("!12 is falsern");
print_char_bin(-1);
printf("-1=%urn",(unsigned char )-1);
if(-1)//有符号数的-1会转成无符号
printf("-1=%d,-1 is truern",-1);
else
printf("-1=%d,-1 is falsern",-1);
if(!(-1))
printf("!(-1)=%d,!(-1) is truern",!(-1));
else
printf("!(-1)=%d,!(-1) is falsern",!(-1));
printf("test completely! rn");
return 0;
}
二、测试结果
xxx$ ./test
m=249
11111001
00000111
i=0,!i is true
j=1,!j is false
k=-1,k is true
k=-1,!k is false
!12 is false
11111111
-1=255
-1=-1,-1 is true
!(-1)=0,!(-1) is false
test completely!