在C语言中<<是什么意思? C语言中%c是什么意思

c\u8bed\u8a00\u4e2d\u7b26\u53f7<<\u662f\u4ec0\u4e48\u610f\u601d

\u7b26\u53f7<<\u5728C\u8bed\u8a00\u4e2d\u4ee3\u8868\u4e86\u5de6\u79fb\u8fd0\u7b97\u7b26\u3002
<<\u7528\u6765\u5c06\u4e00\u4e2a\u6570\u7684\u5404\u4e8c\u8fdb\u5236\u4f4d\u5168\u90e8\u5de6\u79fb\u82e5\u5e72\u4f4d\uff0c\u79fb\u52a8\u7684\u4f4d\u6570\u7531\u53f3\u64cd\u4f5c\u6570\u6307\u5b9a\uff0c\u53f3\u64cd\u4f5c\u6570\u5fc5\u987b\u662f\u975e\u8d1f\u503c\uff0c\u5176\u53f3\u8fb9\u7a7a\u51fa\u7684\u4f4d\u75280\u586b\u8865\uff0c\u9ad8\u4f4d\u5de6\u79fb\u6ea2\u51fa\u5219\u820d\u5f03\u8be5\u9ad8\u4f4d\u3002


\u6269\u5c55\u8d44\u6599
\u5c06a\u7684\u4e8c\u8fdb\u5236\u6570\u5de6\u79fb2\u4f4d\uff0c\u53f3\u88650\u3002\u82e5a=15\uff0c\u5373\u4e8c\u8fdb\u5236\u657000001111\uff0c\u5de6\u79fb2\u4f4d\u5f9700111100\uff0c\u5373\u5341\u8fdb\u5236\u657060\uff08\u4e3a\u7b80\u5355\u8d77\u89c1\uff0c\u75288\u4f4d\u4e8c\u8fdb\u5236\u6570\u8868\u793a\u5341\u8fdb\u5236\u657015\uff0c\u5982\u679c\u752816\u4f4d\u4e8c\u8fdb\u5236\u6570\u8868\u793a\uff0c\u7ed3\u679c\u662f\u4e00\u6837\u7684\uff09\u3002\u9ad8\u4f4d\u5de6\u79fb\u540e\u6ea2\u51fa\uff0c\u820d\u5f03\u3002
\u5de6\u79fb\u4e00\u4f4d\u76f8\u5f53\u4e8e\u8be5\u6570\u4e58\u4ee52\uff0c\u5de6\u79fb2\u4f4d\u76f8\u5f53\u4e8e\u8be5\u6570\u4e58\u4ee52^2=4\u3002\u4e0a\u9762\u4e3e\u7684\u4f8b\u5b5015<< 2=60\uff0c\u5373\u4e58\u4e864\u3002\u4f46\u6b64\u7ed3\u8bba\u53ea\u9002\u7528\u4e8e\u8be5\u6570\u5de6\u79fb\u65f6\u88ab\u6ea2\u51fa\u820d\u5f03\u7684\u9ad8\u4f4d\u4e2d\u4e0d\u5305\u542b1\u7684\u60c5\u51b5\u3002
\u4f8b\u5982\uff0c\u5047\u8bbe\u4ee5\u4e00\u4e2a\u5b57\u8282\uff088\u4f4d\uff09\u5b58\u4e00\u4e2a\u6574\u6570\uff0c\u82e5a\u4e3a\u65e0\u7b26\u53f7\u6574\u578b\u53d8\u91cf\uff0c\u5219a=64\uff0c\u5373\u4e8c\u8fdb\u5236\u657001000000\u65f6\uff0c\u5de6\u79fb\u4e00\u4f4d\u65f6\u6ea2\u51fa\u7684\u662f0\u3002\u800c\u5de6\u79fb2\u4f4d\u65f6\uff0c\u6ea2\u51fa\u7684\u9ad8\u4f4d\u4e2d\u5305\u542b1\uff0c\u5219\u4e0d\u7b26\u5408\u4e0a\u8ff0\u7ed3\u8bba\u3002
\u53c2\u8003\u8d44\u6599\u6765\u6e90\uff1a\u767e\u5ea6\u767e\u79d1-\u5de6\u79fb\u8fd0\u7b97\u7b26

先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符.例如:

int i = 1;
i = i << 2; //把i里的值左移2位

也就是说,1的2进制是000...0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成000...0100,也就是10进制的4,所以说左移1位相当于乘以2,那么左移n位就是乘以2的n次方了(有符号数不完全适用,因为左移有可能导致符号变化,下面解释原因)

需要注意的一个问题是int类型最左端的符号位和移位移出去的情况.我们知道,int是有符号的整形数,最左端的1位是符号位,即0正1负,那么移位的时候就会出现溢出,例如:

int i = 0x40000000; //16进制的40000000,为2进制的01000000...0000
i = i << 1;

那么,i在左移1位之后就会变成0x80000000,也就是2进制的100000...0000,符号位被置1,其他位全是0,变成了int类型所能表示的最小值,32位的int这个值是-2147483648,溢出.如果再接着把i左移1位会出现什么情况呢?在C语言中采用了丢弃最高位的处理方法,丢弃了1之后,i的值变成了0.

左移里一个比较特殊的情况是当左移的位数超过该数值类型的最大位数时,编译器会用左移的位数去模类型的最大位数,然后按余数进行移位,如:

int i = 1, j = 0x80000000; //设int为32位
i = i << 33; // 33 % 32 = 1 左移1位,i变成2
j = j << 33; // 33 % 32 = 1 左移1位,j变成0,最高位被丢弃

在用gcc编译这段程序的时候编译器会给出一个warning,说左移位数>=类型长度.那么实际上i,j移动的就是1位,也就是33%32后的余数.在gcc下是这个规则,别的编译器是不是都一样现在还不清楚.

总之左移就是: 丢弃最高位,0补最低位

再说右移,明白了左移的道理,那么右移就比较好理解了.

右移的概念和左移相反,就是往右边挪动若干位,运算符是>>.

右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变,例如:

int i = 0x80000000;
i = i >> 1; //i的值不会变成0x40000000,而会变成0xc0000000

就是说,符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移.同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位.

负数10100110 >>5(假设字长为8位),则得到的是 11111101

总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效率高很多.

例:C语言中左移<<表示乘以2,右移>>表示除以2,这是由计算机工作原理导致的!但是要是7,二进制数为0111,右移一位得3.5,但是右移之后二进制数变成0011,是3。不一样啊,怎模解释呢??

答:移位操作符的两个操作数必须是整型的。整个移位表达式的值的类型也是整型的,而且,左移位操作符与右移位操作符的运算并不对称。0111右移一位是把最后一位的1去掉,左边补个0,得0011,转换为十进制是3,这是正确的。并不等同于除以2 。

<<是左移操作符,将数字的二进制形式按位左移,末尾补零
例如:
对于unsigned int x=015,x<<1,x<<2,x<<3的分析。

unsigned int x=015,
x=015,用0打头的说明是八进制数,由于后面要进行左移操作,所以转换为二进制看比较方便。
015(八进制)=1101(二进制)

<<:这个是左移操作符,按位左移,末尾补零
>>:这个是右移操作符,按位右移,前端补零

x<<1:左移一位,1101(二进制)左移一位变为11010(二进制),11010(二进制) = 26(十进制)
x<<2:左移两位,1101(二进制)左移两位变为110100(二进制),110100(二进制) = 52(十进制)
x<<3:左移三位,1101(二进制)左移三位变为1101000(二进制),1101000(二进制) = 104(十进制)

现在你应该也看出来了,左移N位就相当于原数乘以2的N次方

先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符.例如:
int
i
=
1;
i
=
i
<<
2;
//把i里的值左移2位
也就是说,1的2进制是000...0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成000...0100,也就是10进制的4,所以说左移1位相当于乘以2,那么左移n位就是乘以2的n次方了(有符号数不完全适用,因为左移有可能导致符号变化,下面解释原因)
需要注意的一个问题是int类型最左端的符号位和移位移出去的情况.我们知道,int是有符号的整形数,最左端的1位是符号位,即0正1负,那么移位的时候就会出现溢出,例如:
int
i
=
0x40000000;
//16进制的40000000,为2进制的01000000...0000
i
=
i
<<
1;
那么,i在左移1位之后就会变成0x80000000,也就是2进制的100000...0000,符号位被置1,其他位全是0,变成了int类型所能表示的最小值,32位的int这个值是-2147483648,溢出.如果再接着把i左移1位会出现什么情况呢?在C语言中采用了丢弃最高位的处理方法,丢弃了1之后,i的值变成了0.
左移里一个比较特殊的情况是当左移的位数超过该数值类型的最大位数时,编译器会用左移的位数去模类型的最大位数,然后按余数进行移位,如:
int
i
=
1,
j
=
0x80000000;
//设int为32位
i
=
i
<<
33;
//
33
%
32
=
1
左移1位,i变成2
j
=
j
<<
33;
//
33
%
32
=
1
左移1位,j变成0,最高位被丢弃
在用gcc编译这段程序的时候编译器会给出一个warning,说左移位数>=类型长度.那么实际上i,j移动的就是1位,也就是33%32后的余数.在gcc下是这个规则,别的编译器是不是都一样现在还不清楚.
总之左移就是:
丢弃最高位,0补最低位
再说右移,明白了左移的道理,那么右移就比较好理解了.
右移的概念和左移相反,就是往右边挪动若干位,运算符是>>.
右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变,例如:
int
i
=
0x80000000;
i
=
i
>>
1;
//i的值不会变成0x40000000,而会变成0xc0000000
就是说,符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移.同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位.
负数10100110
>>5(假设字长为8位),则得到的是
11111101
总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效率高很多.
例:C语言中左移<<表示乘以2,右移>>表示除以2,这是由计算机工作原理导致的!但是要是7,二进制数为0111,右移一位得3.5,但是右移之后二进制数变成0011,是3。不一样啊,怎模解释呢??
答:移位操作符的两个操作数必须是整型的。整个移位表达式的值的类型也是整型的,而且,左移位操作符与右移位操作符的运算并不对称。0111右移一位是把最后一位的1去掉,左边补个0,得0011,转换为十进制是3,这是正确的。并不等同于除以2


先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符.例如:
int
i
=
1;
i
=
i
<<
2;
//把i里的值左移2位
也就是说,1的2进制是000...0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成000...0100,也就是10进制的4,所以说左移1位相当于乘以2,那么左移n位就是乘以2的n次方了(有符号数不完全适用,因为左移有可能导致符号变化,下面解释原因)
需要注意的一个问题是int类型最左端的符号位和移位移出去的情况.我们知道,int是有符号的整形数,最左端的1位是符号位,即0正1负,那么移位的时候就会出现溢出,例如:
int
i
=
0x40000000;
//16进制的40000000,为2进制的01000000...0000
i
=
i
<<
1;
那么,i在左移1位之后就会变成0x80000000,也就是2进制的100000...0000,符号位被置1,其他位全是0,变成了int类型所能表示的最小值,32位的int这个值是-2147483648,溢出.如果再接着把i左移1位会出现什么情况呢?在C语言中采用了丢弃最高位的处理方法,丢弃了1之后,i的值变成了0.
左移里一个比较特殊的情况是当左移的位数超过该数值类型的最大位数时,编译器会用左移的位数去模类型的最大位数,然后按余数进行移位,如:
int
i
=
1,
j
=
0x80000000;
//设int为32位
i
=
i
<<
33;
//
33
%
32
=
1
左移1位,i变成2
j
=
j
<<
33;
//
33
%
32
=
1
左移1位,j变成0,最高位被丢弃
在用gcc编译这段程序的时候编译器会给出一个warning,说左移位数>=类型长度.那么实际上i,j移动的就是1位,也就是33%32后的余数.在gcc下是这个规则,别的编译器是不是都一样现在还不清楚.
总之左移就是:
丢弃最高位,0补最低位
再说右移,明白了左移的道理,那么右移就比较好理解了.
右移的概念和左移相反,就是往右边挪动若干位,运算符是>>.
右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变,例如:
int
i
=
0x80000000;
i
=
i
>>
1;
//i的值不会变成0x40000000,而会变成0xc0000000
就是说,符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移.同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位.
负数10100110
>>5(假设字长为8位),则得到的是
11111101
总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效率高很多.
例:C语言中左移<<表示乘以2,右移>>表示除以2,这是由计算机工作原理导致的!但是要是7,二进制数为0111,右移一位得3.5,但是右移之后二进制数变成0011,是3。不一样啊,怎模解释呢??
答:移位操作符的两个操作数必须是整型的。整个移位表达式的值的类型也是整型的,而且,左移位操作符与右移位操作符的运算并不对称。0111右移一位是把最后一位的1去掉,左边补个0,得0011,转换为十进制是3,这是正确的。并不等同于除以2


是一种符号重载,你可以让他干你想做的任何事。
在标准输出中,是输出到控制台的插入符,如cout<<i; 表示将i的值输出到标准输出设备。

  • c璇█涓int鍜宒ouble鐨勫尯鍒湪鍝噷?
    绛旓細鍦╟++涓紝int鍜宒ouble鏈変互涓嬪嚑涓尯鍒細1銆佺被鍨嬪尯鍒細int鏄畾涔夌殑鏁村瀷鏁版嵁锛屽int a 鍒檃鐨勫煎彧鑳芥槸鏁村瀷锛屾瘮濡俛=3銆俤ouble鍙岀簿搴︽诞鐐规暟锛屽氨鏄湁灏忔暟鐐圭殑鏁般2銆佸湪璁$畻涓殑瀛樺偍鏂瑰紡锛歩nt鍦32浣嶈绠楁満涓崰4涓瓧鑺傦紝杩4涓瓧鑺傜殑鍦ㄥ唴瀛樹腑瀛樻斁鐨勯『搴忎负浣庡瓧鑺傚瓨鍦ㄤ綆鍦板潃锛岄珮瀛楄妭瀛樺湪楂樺湴鍧銆俤ouble鏄64浣...
  • 鈥渵鈥鍦╟璇█涓鏄粈涔堟剰鎬?
    绛旓細濡備笅鍥炬墍绀猴細C璇█鏄竴闂ㄩ氱敤璁$畻鏈虹紪绋嬭瑷锛屽簲鐢ㄥ箍娉涖侰璇█鐨勮璁$洰鏍囨槸鎻愪緵涓绉嶈兘浠ョ畝鏄撶殑鏂瑰紡缂栬瘧銆佸鐞嗕綆绾у瓨鍌ㄥ櫒銆佷骇鐢熷皯閲忕殑鏈哄櫒鐮佷互鍙婁笉闇瑕佷换浣曡繍琛岀幆澧冩敮鎸佷究鑳借繍琛岀殑缂栫▼璇█銆傚敖绠璇█鎻愪緵浜嗚澶氫綆绾у鐞嗙殑鍔熻兘锛屼絾浠嶇劧淇濇寔鐫鑹ソ璺ㄥ钩鍙扮殑鐗规э紝浠ヤ竴涓爣鍑嗚鏍煎啓鍑虹殑C璇█绋嬪簭鍙湪璁稿鐢佃剳骞冲彴...
  • c璇█涓鐨%3c浠涔堟剰鎬?
    绛旓細鏄C璇█涓鐨勬牸寮忓瓧绗︼紝c浠h〃浜嗚緭鍑哄瓧绗︾被鍨嬶紝3浠h〃浜嗗崰浣嶆儏鍐碉紝%3c鐨勬剰鎬濇槸杈撳嚭涓涓崰浣3鐨勫瓧绗︺傚紡鏍峰寲瑙勫畾瀛楃, 浠"%"寮绔, 鍚庤窡涓涓垨鍑犱釜瑙勫畾瀛楃, 鐢ㄦ潵纭畾杈撳嚭鍐呭寮忔牱銆
  • 缁濆鍊鍦╟璇█涓鎬庝箞琛ㄧず
    绛旓細缁濆鍊鍦╟璇█涓鍙互鐢ㄤ娇鐢╝bs()鍑芥暟鎴杅abs()鎴栦娇鐢ㄦ潯浠惰繍绠楃銆佷娇鐢ㄦ潯浠惰繍绠楃銆佷娇鐢ㄤ綅杩愮畻 ^ 鍜 >>銆1銆佷娇鐢ㄦ爣鍑嗗簱鍑芥暟 abs() 鎴 fabs()杩欐槸鏈绠鍗曞拰鏈甯哥敤鐨勬柟娉曪紝鍙渶瑕佸紩鍏ュご鏂囦欢 <stdlib.h> 鎴 <math.h>锛岀劧鍚庤皟鐢 abs() 鍑芥暟鎴 fabs() 鍑芥暟鍗冲彲銆俛bs() 鍑芥暟閫傜敤浜庢暣鏁帮紝fabs() ...
  • C璇█涓% c鏄粈涔堟剰鎬?
    绛旓細s:杈撳叆杈撳嚭涓哄瓧绗︿覆 f:杈撳叆杈撳嚭涓烘诞鐐瑰瀷 printf( stream, "%s%c", s, c );s -- 鎵撳嵃鏍煎紡锛屾寜瀛楃涓叉柟寮忚緭鍑哄彉閲弒鐨勫硷紙瀛楃涓诧級鍒版枃浠舵祦stream c -- 鎵撳嵃鏍煎紡锛屾寜ASCII瀛楃鏂瑰紡杈撳嚭鍙橀噺c鐨勫(鍗虫墦鍗颁竴涓瓧绗︼級鍒版枃浠舵祦stream :鍦–++涓湁涓ょ鎰忔濓紝涓绉嶆槸鍙栧湴鍧绗︼紝鏄崟鐩繍绠楃锛涘彟涓绉...
  • C璇█涓鐨勫瓧绗﹁〃绀轰粈涔?
    绛旓細鍦╟璇█涓瀛楃涓昏鏈変袱绫 1銆佸氨鏄櫘閫氬瓧绗︺傚瓧绗﹀寘鍚櫘閫氬瓧绗﹀拰杞箟瀛楃锛岄渶瑕佺敤鈥樷欙紙涓や釜鍗曞紩鍙凤級鍖呭惈銆備緥濡 'a' 鏄櫘閫氬瓧绗︼紱'\n'鏄浆涔夊瓧绗︺2銆佽浆涔夊瓧绗︽槸C璇█涓〃绀哄瓧绗︾殑涓绉嶇壒娈婂舰寮忋傞氬父浣跨敤杞箟瀛楃琛ㄧずASCII鐮佸瓧绗﹂泦涓笉鍙墦鍗扮殑鎺у埗瀛楃鍜岀壒瀹氬姛鑳界殑瀛楃锛屽鐢ㄤ簬琛ㄧず瀛楃甯搁噺鐨勫崟鎾囧彿...
  • 鍦–璇█涓 鍙栨暣 , 姹備綑鐨勭鍙峰悇鏄粈涔?
    绛旓細鍦 C璇█涓 鍙栨暣 锛 姹備綑鐨勭鍙峰悇鏄粈涔堬紵 void main() { int a = 3, b = 5, c = 0; c = b / a; 鍙朾闄や互a鐨勬暣鏁伴儴鍒 pritnf( "%d\n", c); c = b%a; 鍙朾闄や互a鐨勪綑鏁 pritnf( "%d\n", c); } 濡傛灉杩愮畻鍏冩槸鏁存暟锛岄偅涔堝氨鏄暣闄わ紝鍚﹀垯灏辨槸娴偣闄わ紝姹備綑鐨...
  • &鍦–璇█涓琛ㄧず浠涔堟剰鎬?
    绛旓細&鍦–璇█涓鍙兘琛ㄧず涓ょ杩愮畻绗︺1銆佸鏋滆繍绠楀璞″彧鏈変竴涓紝涓斾负鍙虫搷浣滄暟锛岄偅涔&涓哄彇鍦板潃杩愮畻绗︼紝缁撴灉涓烘搷浣滃璞$殑鍦板潃銆備緥濡&a锛堝亣璁綼鏄竴涓乏鍊硷紝鍗冲叿鏈夊叿浣撶殑鍙闂殑鍦板潃锛夌粨鏋滀负a鐨勫湴鍧銆2銆佸鏋滆繍绠楀璞℃湁涓や釜锛岄偅涔&琛ㄧず浣嶄笌杩愮畻銆傜粨鏋滀腑鐨勬瘡涓涓簩杩涘埗浣嶇瓑浜庝袱涓繍绠楁暟鐨勫搴斾綅缃殑浜岃繘鍒朵綅...
  • 鈥<<鈥鍦–璇█涓浠h〃浠涔?
    绛旓細鈥<<鈥鍦–璇█涓浠h〃浠涔堬紵"<<"鍦–璇█涓唬琛ㄥ乏绉昏繍绠楃锛屽畠鏄竴涓綅杩愮畻鎿嶄綔锛岀敤浜庡皢鏁板煎悜宸︾Щ鍔ㄦ寚瀹氱殑浣嶆暟銆
  • %鍦╟璇█涓鏄粈涔堟剰鎬
    绛旓細lf/%le鐢ㄤ簬杈撳嚭double鍨嬶紝%g閫%e/%f闀垮害灏忕殑涓绉嶏紝涓斾笉杈撳嚭澶氫綑鐨勯浂銆俹杈撳嚭鍏繘鍒讹紝涓嶄細杈撳嚭璐熺殑锛%x杈撳嚭鍗佸叚杩涘埗銆俬d鐢ㄤ簬杈撳嚭鐭暣鍨嬨俿鐢ㄤ簬瀛楃涓 C璇█杩愮畻绗︾殑浼樺厛绾э細1銆佷紭鍏堢骇:C璇█涓锛岃繍绠楃鐨勮繍绠椾紭鍏堢骇鍏卞垎涓15 绾с1 绾ф渶楂橈紝15 绾ф渶浣庛 鍦ㄨ〃杈惧紡涓紝浼樺厛绾ц緝楂樼殑鍏堜簬浼樺厛绾ц緝浣...
  • 扩展阅读:男士spa行内术语 ... spa暗示术语 ... lt男女之间什么意思 ... 女生说喜欢lm ... 石家庄威尼斯洗浴 暗号 ... lt暗指什么服务 ... tt ... lt网络流行语 ... 榜一可lt什么意思 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网