intmain(){ unsignedchara=0xA5,b; b=~a>>5; printf("%u\n",b); } 假定该环境下的寄存器为16位 现在规定unsigned char的值为0xa5,也就是165,将a先取反再向右移5,得出的结果不是2而是250 错误思路: unsigned char占一个字节,即8bit,将a写入内存中的形式为: 1010 0101 按照常规来说,将a取反为 0...
unsigned char a=0xa5;//定义变量a的值为无符号的十六进制值a5,a的二进制为:10100101 b=~a>>4+1;//表示的意思为变量a的二进制值右移5位,再取反b变量的二进制值为:11111010;b的十进制为250 所以输出为b=250
0xA5 是16进制!!! 二进制就是a = 10*16^1+5*16^0=165 = 128 + 32 +4+1 =10100101
6unsignedchara=0xA5; 7//取反优先级高于移位 8unsignedcharb=~a>>4; 9/*现行pc机为32位,即该存储单元亦为32位,对于位操作,在计算时尽管为char,先提升为int类型,再各位取反。C语言并不存在8位位运算,操作数在做位运算之前至少被提升int型(32位);~a为1111 1111 1111 1111 1111 1111 0101 1010;~a>>...
6unsignedchara=0xA5; 7//取反优先级高于移位 8unsignedcharb=~a>>4; 9/*现行pc机为32位,即该存储单元亦为32位,对于位操作,在计算时尽管为char,先提升为int类型,再各位取反。C语言并不存在8位位运算,操作数在做位运算之前至少被提升int型(32位);~a为1111 1111 1111 1111 1111 1111 0101 1010;~a>>...
long long a = 0x38; printf("%c\n", a);这样的代码片段也是合法的,且出输出一个8。另外,ASCII也是有多种扩展的,在使用扩展ASCII时,以个人的经验,char和unsigned char并无明显区别。如:char m = 0xa5; unsigned char n = 0xa5; printf("%c\n", m); printf("%c\n", n);...
include "stdio.h"int main(int argc, char const *argv[]) { unsigned char a = 0xa5; printf ( "%0x", ~a ); //显示ffffff5a unsigned char b = (~a) >> ( 1 + 2 + 3); printf ( "\n%0x %0x", b, 0xffffff5a >> 6 ); //显示fd 3fffffd...
long long a = 0x38; printf("%c\n", a); 这样的代码片段也是合法的,且出输出一个8。 另外,ASCII也是有多种扩展的,在使用扩展ASCII时,以个人的经验,char和unsigned char并无明显区别。如: char m = 0xa5; unsigned char n = 0xa5; printf("%c\n", m); printf("%c\n", n); ...
(1)对于(signed)char来说,0x80用二进制表示为1000 0000,当它作为char赋值给unsigned int或 int 时,系统认为最高位是符号位,会对最高位进行扩展。而0x7F用二进制表示为0111 1111,最高位为0,不会扩展。 (2)对于unsigned char来说,不管最高位是0,还是1,都不会做扩展。 ...
比如0xFF,在unsigned char用printf打印出来是255,而char是-1。 但是看过别人的一个博客,里面有指出,把一个char类型的变量赋值给int、long等数据类型或进行类似的强制类型转换时时,系统会进 行类型扩展,这时区别就大了。对于char类型的变量,系统会认为最高位为符号位,然后对最高位进行扩展,即符号扩展。若最高位...