位运算

_t的意思到底表示什么?具体的官方答案没有找到,不过我觉得有个答案比较接近。它就是一个结构的标注,可以理解为type/typedef的缩写,表示它是通过typedef定义的,而不是其它数据类型。

uint8_t,uint16_t,uint32_t等都不是什么新的数据类型,它们只是使用typedef给类型起的别名,新瓶装老酒的把戏。不过,不要小看了typedef,它对于你代码的维护会有很好的作用。比如C中没有bool,于是在一个软件中,一些程序员使用int,一些程序员使用short,会比较混乱,最好就是用一个typedef来定义,如:
typedef char bool;

一般来说,一个C的工程中一定要做一些这方面的工作,因为你会涉及到跨平台,不同的平台会有不同的字长,所以利用预编译和typedef可以让你最有效的维护你的代码。为了用户的方便,C99标准的C语言硬件为我们定义了这些类型,我们放心使用就可以了。

 

以下内容转载自http://apps.hi.baidu.com/share/detail/32935657

[cpp] view plain copy

    按照posix标准,一般整型对应的*_t类型为:  
    1字节     uint8_t  
    2字节     uint16_t  
    4字节     uint32_t  
    8字节     uint64_t  


stdint.h文件如下:

[cpp] view plain copy

    /* Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. 
    This file is part of the GNU C Library. 
     
    The GNU C Library is free software; you can redistribute it and/or 
    modify it under the terms of the GNU Lesser General Public 
    License as published by the Free Software Foundation; either 
    version 2.1 of the License, or (at your option) any later version. 
     
    The GNU C Library is distributed in the hope that it will be useful, 
    but WITHOUT ANY WARRANTY; without even the implied warranty of 
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 
    Lesser General Public License for more details. 
     
    You should have received a copy of the GNU Lesser General Public 
    License along with the GNU C Library; if not, write to the Free 
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 
    02111-1307 USA. */  
      
    /* 
    * ISO C99: 7.18 Integer types <stdint.h> 
    */  
      
    #ifndef _STDINT_H  
    #define _STDINT_H   1  
      
    #include <features.h>  
    #include <bits/wchar.h>  
    #include <bits/wordsize.h>  
      
    /* Exact integral types. */  
      
    /* Signed. */  
      
    /* There is some amount of overlap with <sys/types.h> as known by inet code */  
    #ifndef __int8_t_defined  
    # define __int8_t_defined  
    typedef signed char     int8_t;  
    typedef short int       int16_t;  
    typedef int         int32_t;  
    # if __WORDSIZE == 64  
    typedef long int        int64_t;  
    # else  
    __extension__  
    typedef long long int       int64_t;  
    # endif  
    #endif  
      
    /* Unsigned. */  
    typedef unsigned char       uint8_t;  
    typedef unsigned short int uint16_t;  
    #ifndef __uint32_t_defined  
    typedef unsigned int        uint32_t;  
    # define __uint32_t_defined  
    #endif  
    #if __WORDSIZE == 64  
    typedef unsigned long int   uint64_t;  
    #else  
    __extension__  
    typedef unsigned long long int uint64_t;  
    #endif  
      
      
    /* Small types. */  
      
    /* Signed. */  
    typedef signed char     int_least8_t;  
    typedef short int       int_least16_t;  
    typedef int         int_least32_t;  
    #if __WORDSIZE == 64  
    typedef long int        int_least64_t;  
    #else  
    __extension__  
    typedef long long int       int_least64_t;  
    #endif  
      
    /* Unsigned. */  
    typedef unsigned char       uint_least8_t;  
    typedef unsigned short int uint_least16_t;  
    typedef unsigned int        uint_least32_t;  
    #if __WORDSIZE == 64  
    typedef unsigned long int   uint_least64_t;  
    #else  
    __extension__  
    typedef unsigned long long int uint_least64_t;  
    #endif  
      
      
    /* Fast types. */  
      
    /* Signed. */  
    typedef signed char     int_fast8_t;  
    #if __WORDSIZE == 64  
    typedef long int        int_fast16_t;  
    typedef long int        int_fast32_t;  
    typedef long int        int_fast64_t;  
    #else  
    typedef int         int_fast16_t;  
    typedef int         int_fast32_t;  
    __extension__  
    typedef long long int       int_fast64_t;  
    #endif  
      
    /* Unsigned. */  
    typedef unsigned char       uint_fast8_t;  
    #if __WORDSIZE == 64  
    typedef unsigned long int   uint_fast16_t;  
    typedef unsigned long int   uint_fast32_t;  
    typedef unsigned long int   uint_fast64_t;  
    #else  
    typedef unsigned int        uint_fast16_t;  
    typedef unsigned int        uint_fast32_t;  
    __extension__  
    typedef unsigned long long int uint_fast64_t;  
    #endif  
      
      
    /* Types for `void *' pointers. */  
    #if __WORDSIZE == 64  
    # ifndef __intptr_t_defined  
    typedef long int        intptr_t;  
    # define __intptr_t_defined  
    # endif  
    typedef unsigned long int   uintptr_t;  
    #else  
    # ifndef __intptr_t_defined  
    typedef int         intptr_t;  
    # define __intptr_t_defined  
    # endif  
    typedef unsigned int        uintptr_t;  
    #endif  
      
      
    /* Largest integral types. */  
    #if __WORDSIZE == 64  
    typedef long int        intmax_t;  
    typedef unsigned long int   uintmax_t;  
    #else  
    __extension__  
    typedef long long int       intmax_t;  
    __extension__  
    typedef unsigned long long int uintmax_t;  
    #endif  
      
      
    /* The ISO C99 standard specifies that in C++ implementations these 
    macros should only be defined if explicitly requested. */  
    #if !defined __cplusplus || defined __STDC_LIMIT_MACROS  
      
    # if __WORDSIZE == 64  
    # define __INT64_C(c) c ## L  
    # define __UINT64_C(c) c ## UL  
    # else  
    # define __INT64_C(c) c ## LL  
    # define __UINT64_C(c) c ## ULL  
    # endif  
      
    /* Limits of integral types. */  
      
    /* Minimum of signed integral types. */  
    # define INT8_MIN       (-128)  
    # define INT16_MIN      (-32767-1)  
    # define INT32_MIN      (-2147483647-1)  
    # define INT64_MIN      (-__INT64_C(9223372036854775807)-1)  
    /* Maximum of signed integral types. */  
    # define INT8_MAX       (127)  
    # define INT16_MAX      (32767)  
    # define INT32_MAX      (2147483647)  
    # define INT64_MAX      (__INT64_C(9223372036854775807))  
      
    /* Maximum of unsigned integral types. */  
    # define UINT8_MAX      (255)  
    # define UINT16_MAX     (65535)  
    # define UINT32_MAX     (4294967295U)  
    # define UINT64_MAX     (__UINT64_C(18446744073709551615))  
      
      
    /* Minimum of signed integral types having a minimum size. */  
    # define INT_LEAST8_MIN     (-128)  
    # define INT_LEAST16_MIN    (-32767-1)  
    # define INT_LEAST32_MIN    (-2147483647-1)  
    # define INT_LEAST64_MIN    (-__INT64_C(9223372036854775807)-1)  
    /* Maximum of signed integral types having a minimum size. */  
    # define INT_LEAST8_MAX     (127)  
    # define INT_LEAST16_MAX    (32767)  
    # define INT_LEAST32_MAX    (2147483647)  
    # define INT_LEAST64_MAX    (__INT64_C(9223372036854775807))  
      
    /* Maximum of unsigned integral types having a minimum size. */  
    # define UINT_LEAST8_MAX    (255)  
    # define UINT_LEAST16_MAX   (65535)  
    # define UINT_LEAST32_MAX   (4294967295U)  
    # define UINT_LEAST64_MAX   (__UINT64_C(18446744073709551615))  
      
      
    /* Minimum of fast signed integral types having a minimum size. */  
    # define INT_FAST8_MIN      (-128)  
    # if __WORDSIZE == 64  
    # define INT_FAST16_MIN    (-9223372036854775807L-1)  
    # define INT_FAST32_MIN    (-9223372036854775807L-1)  
    # else  
    # define INT_FAST16_MIN    (-2147483647-1)  
    # define INT_FAST32_MIN    (-2147483647-1)  
    # endif  
    # define INT_FAST64_MIN     (-__INT64_C(9223372036854775807)-1)  
    /* Maximum of fast signed integral types having a minimum size. */  
    # define INT_FAST8_MAX      (127)  
    # if __WORDSIZE == 64  
    # define INT_FAST16_MAX    (9223372036854775807L)  
    # define INT_FAST32_MAX    (9223372036854775807L)  
    # else  
    # define INT_FAST16_MAX    (2147483647)  
    # define INT_FAST32_MAX    (2147483647)  
    # endif  
    # define INT_FAST64_MAX     (__INT64_C(9223372036854775807))  
      
    /* Maximum of fast unsigned integral types having a minimum size. */  
    # define UINT_FAST8_MAX     (255)  
    # if __WORDSIZE == 64  
    # define UINT_FAST16_MAX   (18446744073709551615UL)  
    # define UINT_FAST32_MAX   (18446744073709551615UL)  
    # else  
    # define UINT_FAST16_MAX   (4294967295U)  
    # define UINT_FAST32_MAX   (4294967295U)  
    # endif  
    # define UINT_FAST64_MAX    (__UINT64_C(18446744073709551615))  
      
      
    /* Values to test for integral types holding `void *' pointer. */  
    # if __WORDSIZE == 64  
    # define INTPTR_MIN        (-9223372036854775807L-1)  
    # define INTPTR_MAX        (9223372036854775807L)  
    # define UINTPTR_MAX       (18446744073709551615UL)  
    # else  
    # define INTPTR_MIN        (-2147483647-1)  
    # define INTPTR_MAX        (2147483647)  
    # define UINTPTR_MAX       (4294967295U)  
    # endif  
      
      
    /* Minimum for largest signed integral type. */  
    # define INTMAX_MIN     (-__INT64_C(9223372036854775807)-1)  
    /* Maximum for largest signed integral type. */  
    # define INTMAX_MAX     (__INT64_C(9223372036854775807))  
      
    /* Maximum for largest unsigned integral type. */  
    # define UINTMAX_MAX        (__UINT64_C(18446744073709551615))  
      
      
    /* Limits of other integer types. */  
      
    /* Limits of `ptrdiff_t' type. */  
    # if __WORDSIZE == 64  
    # define PTRDIFF_MIN       (-9223372036854775807L-1)  
    # define PTRDIFF_MAX       (9223372036854775807L)  
    # else  
    # define PTRDIFF_MIN       (-2147483647-1)  
    # define PTRDIFF_MAX       (2147483647)  
    # endif  
      
    /* Limits of `sig_atomic_t'. */  
    # define SIG_ATOMIC_MIN     (-2147483647-1)  
    # define SIG_ATOMIC_MAX     (2147483647)  
      
    /* Limit of `size_t' type. */  
    # if __WORDSIZE == 64  
    # define SIZE_MAX      (18446744073709551615UL)  
    # else  
    # define SIZE_MAX      (4294967295U)  
    # endif  
      
    /* Limits of `wchar_t'. */  
    # ifndef WCHAR_MIN  
    /* These constants might also be defined in <wchar.h>. */  
    # define WCHAR_MIN     __WCHAR_MIN  
    # define WCHAR_MAX     __WCHAR_MAX  
    # endif  
      
    /* Limits of `wint_t'. */  
    # define WINT_MIN       (0u)  
    # define WINT_MAX       (4294967295u)  
      
    #endif /* C++ && limit macros */  
      
      
    /* The ISO C99 standard specifies that in C++ implementations these 
    should only be defined if explicitly requested. */  
    #if !defined __cplusplus || defined __STDC_CONSTANT_MACROS  
      
    /* Signed. */  
    # define INT8_C(c) c  
    # define INT16_C(c) c  
    # define INT32_C(c) c  
    # if __WORDSIZE == 64  
    # define INT64_C(c)    c ## L  
    # else  
    # define INT64_C(c)    c ## LL  
    # endif  
      
    /* Unsigned. */  
    # define UINT8_C(c) c ## U  
    # define UINT16_C(c)    c ## U  
    # define UINT32_C(c)    c ## U  
    # if __WORDSIZE == 64  
    # define UINT64_C(c)   c ## UL  
    # else  
    # define UINT64_C(c)   c ## ULL  
    # endif  
      
    /* Maximal type. */  
    # if __WORDSIZE == 64  
    # define INTMAX_C(c)   c ## L  
    # define UINTMAX_C(c) c ## UL  
    # else  
    # define INTMAX_C(c)   c ## LL  
    # define UINTMAX_C(c) c ## ULL  
    # endif  
      
    #endif /* C++ && constant macros */  
      
    #endif /* stdint.h */  




假设如果 A = 60,且 B = 13,现在以二进制格式表示,它们如下所示:

A = 0011 1100

B = 0000 1101

-----------------

A&B = 0000 1100

A|B = 0011 1101

A^B = 0011 0001

~A  = 1100 0011

下表显示了 C++ 支持的位运算符。假设变量 A 的值为 60,变量 B 的值为 13,则:

运算符描述实例
&如果同时存在于两个操作数中,二进制 AND 运算符复制一位到结果中。(A & B) 将得到 12,即为 0000 1100
|如果存在于任一操作数中,二进制 OR 运算符复制一位到结果中。(A | B) 将得到 61,即为 0011 1101
^如果存在于其中一个操作数中但不同时存在于两个操作数中,二进制异或运算符复制一位到结果中。(A ^ B) 将得到 49,即为 0011 0001
~二进制补码运算符是一元运算符,具有"翻转"位效果,即0变成1,1变成0。(~A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。
<<二进制左移运算符。左操作数的值向左移动右操作数指定的位数。A << 2 将得到 240,即为 1111 0000
>>二进制右移运算符。左操作数的值向右移动右操作数指定的位数。A >> 2 将得到 15,即为 0000 1111

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值