首页 > 编程语言 > 详细

C 语言 机器码/位运算/大端小端

时间:2020-09-14 20:08:01      阅读:55      评论:0      收藏:0      [点我收藏+]

在计算机中数据以二进制存储

位bit                 0/1
bety字节              8bit
Word(字)        (intel中16bit) 
Dword                (双字)    
Qword                (四字)
Tbyte               (十字节)        
真值:-111         //以十进制数 -111为例

短除法求其他进制:  
111 ÷ 2 = 55 …… 155  ÷ 2 = 27 …… 127  ÷ 2 = 13 …… 113  ÷ 2 = 6  …… 16   ÷ 2 = 3  …… 03   ÷ 2 = 1  …… 11   ÷ 2 = 0  …… 1;  //从下往上写11101111;
转十进制可以使用加权法:
1*2^0 + 1*2^1 +1*2^2 + 1*2^3 + 0*2^4 + 1*2^5 + 1*2^6 + 1*2^7 = 111
熟练后可以
0000 0000        //正负 64 32 16    8 4 2 0
原码:11101111;    //以二进制表示 最高位 1 表示 负;0 表示 正;
反码:10010000;    //除了最高位 1变0 0变1;
补码:10010001。    //在反码的基础上+1;
//如果是正数,那么原码反码补码都是原码;

需要注意的是在计算机中数值全部以补码来存储

例如:
unsigned char;
无符号,1字节,取值范围0~2^8-1,即2^8个数;

char
取值范围为-2^7~2^7-1(-128~127);  
1000 0000 表示的是-1280000 0000 表示的是0;

计算机不会做减法例如 -128-3 == -127 + (-1)

-127 = 1111 1111;补码:1000 0001;
  -1 = 1000 0001;补码:1111 1111;
补码相加:1 1000 0000;
再转化为原码:1000 0000(-128);

位运算:

printf("%d",1 & 2);        //0001(补码) & 0010(补码) = 0000(补码) = 0000(原码) = 0;
printf("%d",1 | -2);       //0001(补码) | 1110(补码) = 1111(补码) = 1001(原码) = -1;
printf("%d",1 >> 2);       //0001(补码)去掉右边两位,左边补两个0 = 0000(原码) = 0;
printf("%d",-1 << 2);      //1111(补码)去掉左边两位,右边补两个0 = 1100(原码) = -4;
printf("%d", ~2);          //~按位取反运算符 优先级高于>>右移位运算符;  0010(补码) ~(包括符号位一起取反) 1101(补码) = 1011(原码) = -3;
printf("%d",1 ^ 2);        //相同为0不同为1:0001(补码) ^ 0010(补码) = 0011(原码) = 3;
//如果是左移,则规定补入的数全部是0;如果是右移,还与被移位的数据是否带符号有关。若是不带符号数,则补入的数全部为0;若是带符号数,则补入的数全部等于原数的最左端位上的原数(即原符号位)

 

C 语言 机器码/位运算/大端小端

原文:https://www.cnblogs.com/hyby/p/13668698.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!