C

基本运算符

运算符符号操作用例结果
加法+使它两侧的值加到一起1+23
减法-从它前面的数减去后面的数5-32
乘法*将它前面的数乘以后面的数2*36
除法/用它左边的值除以右边的值8/32(整数的除法会丢掉小数部分)
取模%求用它左边的值除以右边的数后的余数5%32(%运算符两侧的操作数必须为整数)

位操作符

位操作就是直接对整数在内存中的二进制位进行操作。
其操作数是位序列。
C 语言中提供了 &(与)、|(或)、^(异或)、~(取反)、>>(右移)、<<(左移)6 种位操作符。

尽量避免对未知的有符号数执行位操作
在 C 语言中,如果在未知的有符号数上执行位操作,很可能会导致缓冲区溢出,从而在某些情况下导致攻击者执行任意代码,同时,还可能会出现出乎意料的行为或编译器定义的行为。

&(与)

位与运算符(&):如果两个操作数中的某位都为1,那么结果值便为1,否则,改为便是0;

    int x = 0x96; // 1001 0110
    int y = 0x93; // 1001 0011
    int z = x & y;// 1001 0010

|(或)

位或运算符( | ):如果两个操作数的某位中某一位为1,那么结果该位就为1;

    int x = 0x96; // 1001 0110
    int y = 0x93; // 1001 0011
    int z = x | y;// 1001 0111

^(异或)

位异或运算符(^):仅在两个操作数的对应位中只有一位设为1的时候,结果为才为1.

    int x = 0x96; // 1001 0110
    int y = 0x93; // 1001 0011
    int z = x ^ y;// 0000 0101

~(取反)

位反运算符(~):将操作数中的每一位取反,将1转换为0或将0转换为1

    int x = 0x96; // 1001 0110
    int y = ~x;   // 0110 1001

>>(右移)

在右移中合理地选择 0 或符号位来填充空出的位 在右移运算中,空出的位用 0 还是符号位进行填充呢?

其实答案由具体的 C 语言编译器实现来决定。在通常情况下,如果要进行移位的操作数是无符号类型的,那么空出的位将用 0 进行填充;如果要进行移位的操作数是有符号类型的,则 C 语言编译器实现既可选择 0 来进行填充,也可选择符号位进行填充。

因此,如果很关心一个右移运算中的空位,那么可以使用 unsigned 修饰符来声明变量,这样空位都会被设置为 0。同时,如果一个程序采用了有符号数的右移位操作,那么它就是不可移植的。

    int x = 0x96; // 1001 0110
    int y = x>>3; // 0001 0010

<<(左移)

通过将一个位组合中的所有位向左或者向右移动指定数量的位形成新值。对于左移运算符,空出的位设为0,对于右移运算符,如果是无符号类型,则空出的位为0,对于有符号的值,正数空出来的值填0,负数则填1.

    int x = 0x96; // 1001 0110
    int y = x<<3; // 1011 0000

其他运算符

sizeof

#include<stdio.h>
int main()
{
        int n=0;
        int intsize = sizeof(int);
        printf("int sizeof is %d bytes\n",intsize);
        return 0;
}

在32位操作系统下,运行结果如下:

int sizeof is 4 bytes


フレッツ光が月額556円~【GMOとくとくBB】

コメント:



(画像の文字列を入力して下さい)

トップ   編集 凍結 差分 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019/12/02 (月) 12:33:00 (1628d)

PCpዾyǗlgĂ܂}WŔ܂z 萔O~ył񂫁z Yahoo yV NTT-X Store

z[y[W ̃NWbgJ[h COiq ӂ邳Ɣ[ COsیI COze