前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言逻辑取反! 学习

C语言逻辑取反! 学习

原创
作者头像
IT工作者
发布2022-05-20 15:52:59
1.4K0
发布2022-05-20 15:52:59
举报
文章被收录于专栏:程序技术知识程序技术知识

一、测试代码,!: 代表值得取反,对于整型变量,只要不为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=%u\r\n",(unsigned char )m); 
    print_char_bin(m);
    print_char_bin(n);
    
    if(!i)
          printf("i=%d,!i is true\r\n",i);
    else 
          printf("i=%d,!i is false\r\n",i);
      
    if(!j)
          printf("j=%d,!j is true\r\n",j);
    else 
          printf("j=%d,!j is false\r\n",j);
       
    if(k)
         printf("k=%d,k is true\r\n",k); 
    else 
         printf("k=%d,k is false\r\n",k);
 
    if(!k)
         printf("k=%d,!k is true\r\n",k); 
     else 
         printf("k=%d,!k is false\r\n",k);
 
     if(!12)
         printf("!12 is true\r\n"); 
     else 
         printf("!12 is false\r\n");
 
    print_char_bin(-1);
    printf("-1=%u\r\n",(unsigned char )-1); 
    if(-1)//有符号数的-1会转成无符号
         printf("-1=%d,-1 is true\r\n",-1); 
    else 
         printf("-1=%d,-1 is false\r\n",-1);
 
    if(!(-1))
         printf("!(-1)=%d,!(-1) is true\r\n",!(-1)); 
    else 
         printf("!(-1)=%d,!(-1) is false\r\n",!(-1));
     
    printf("test completely! \r\n");
    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!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档