C语言逻辑取反! 学习

2022-05-20 15:52:59 浏览数 (1)

一、测试代码,!: 代表值得取反,对于整型变量,只要不为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!

0 人点赞