从1的补码说起计算机的数制

来源:互联网 发布:汽车防盗芯片编程器 编辑:程序博客网 时间:2024/05/17 04:04

字节换算

bit(b)=位

字节(byte)=8位 -128~127 0~255

半字=2字节=16位 -32768~32767 0~65,535

字(word)=4字节=32位 -2147483848~2147483647 0~4,294,967,295

双字=8字节=64位 -9223372036854775808~9223372036854775807 0~18,446,744,073,709,551,615

十进制-1的二进制表示

在IA-32平台使用补码表示带符号的整数

反码:无符号整数相反代码1->0;0->1。

补码:反码+1

过程

在一个字节中1

二进制是0000 0001

反码 1111 1110

补码 1111 1111 即-1

补码从1111 1111 开始递减直到1000 0000表示-128

一个 16位的1的二进制是

0000 0000 0000 0001

补码即-1是

1111 1111 1111 1111

注意不要把8位的1111 1111即-1和15位的1111 1111 1111 1111即-1混淆!同时16位中1111 1111是255

16位编译器和32位编译器

16位下int 2个字节 long 4个字节 short 2个字节

32位下int4个字节 long 4个字节 short 2个字节

64位下int4个字节 long 8个字节 short 2个字节

printf( "size of \"short\" =%lu\n", sizeof(short));    printf( "size of \"char\" =%lu\n", sizeof(char));    printf( "size of \"long\" =%lu\n", sizeof(long));    printf( "size of \"double\" =%lu\n", sizeof(double));    printf( "size of \"int\" =%lu\n", sizeof(int));    printf( "bit of \"int\" =%lu\n", sizeof(int)*8);

32位和64位下输出比较

各种常数 规则 范例
十进制 一般十进制格式 1234
二进制 以0b开头 0b00111010
八进制 以O开头 O056
十六进制 以开0x头 0x56ab
无正负号整数常数 结尾加上U 300U
长整数常数 结尾加上L 300L
无正负号整数常数 结尾加上UL 300UL
浮点数常数 结尾加上F 4.32F
字符常数 单引号中的文字 ‘a’
字符串常数 双引号中的文字 “hello”

int和Long等的最大最小值MAX和MIN可以参考 limits.h

#whereis limits.h

limits: /usr/include/limits.h

 

32位下的
limits.h

/* *ISO C99 Standard: 7.10/5.2.4.2.1 Sizes of integer types<limits.h> */#ifndef _LIBC_LIMITS_H_#define _LIBC_LIMITS_H_1#include <features.h>/* Maximum length of any multibyte character in any locale.   We define this value here since the gcc header does not define   the correct value.  */#define MB_LEN_MAX16/* If we are not using GNU CC we have to define all the symbols ourself.   Otherwise use gcc's definitions (see below).  */#if !defined __GNUC__ || __GNUC__ < 2/* We only protect from multiple inclusion here, because all the other   #include's protect themselves, and in GCC 2 we may #include_next through   multiple copies of this file before we get to GCC's.  */# ifndef _LIMITS_H#  define _LIMITS_H1#include <bits/wordsize.h>/* We don't have #include_next.   Define ANSI <limits.h> for standard 32-bit words.  *//* These assume 8-bit `char's, 16-bit `short int's,   and 32-bit `int's and `long int's.  *//* Number of bits in a `char'.*/#  define CHAR_BIT8/* Minimum and maximum values a `signed char' can hold.  */#  define SCHAR_MIN(-128)#  define SCHAR_MAX127/* Maximum value an `unsigned char' can hold.  (Minimum is 0.)  */#  define UCHAR_MAX255/* Minimum and maximum values a `char' can hold.  */#  ifdef __CHAR_UNSIGNED__#   define CHAR_MIN0#   define CHAR_MAXUCHAR_MAX#  else#   define CHAR_MINSCHAR_MIN#   define CHAR_MAXSCHAR_MAX#  endif/* Minimum and maximum values a `signed short int' can hold.  */#  define SHRT_MIN(-32768)#  define SHRT_MAX32767/* Maximum value an `unsigned short int' can hold.  (Minimum is 0.)  */#  define USHRT_MAX65535/* Minimum and maximum values a `signed int' can hold.  */#  define INT_MIN(-INT_MAX - 1)#  define INT_MAX2147483647/* Maximum value an `unsigned int' can hold.  (Minimum is 0.)  */#  define UINT_MAX4294967295U/* Minimum and maximum values a `signed long int' can hold.  */#  if __WORDSIZE == 64#   define LONG_MAX9223372036854775807L#  else#   define LONG_MAX2147483647L#  endif#  define LONG_MIN(-LONG_MAX - 1L)/* Maximum value an `unsigned long int' can hold.  (Minimum is 0.)  */#  if __WORDSIZE == 64#   define ULONG_MAX18446744073709551615UL#  else#   define ULONG_MAX4294967295UL#  endif#  ifdef __USE_ISOC99/* Minimum and maximum values a `signed long long int' can hold.  */#   define LLONG_MAX9223372036854775807LL#   define LLONG_MIN(-LLONG_MAX - 1LL)/* Maximum value an `unsigned long long int' can hold.  (Minimum is 0.)  */#   define ULLONG_MAX18446744073709551615ULL#  endif /* ISO C99 */# endif/* limits.h  */#endif/* GCC 2.  */#endif/* !_LIBC_LIMITS_H_ */ /* Get the compiler's limits.h, which defines almost all the ISO constants.    We put this #include_next outside the double inclusion check because    it should be possible to include this file more than once and still get    the definitions from gcc's header.  */#if defined __GNUC__ && !defined _GCC_LIMITS_H_/* `_GCC_LIMITS_H_' is what GCC's file defines.  */# include_next <limits.h>#endif/* The <limits.h> files in some gcc versions don't define LLONG_MIN,   LLONG_MAX, and ULLONG_MAX.  Instead only the values gcc defined for   ages are available.  */#if defined __USE_ISOC99 && defined __GNUC__# ifndef LLONG_MIN#  define LLONG_MIN(-LLONG_MAX-1)# endif# ifndef LLONG_MAX#  define LLONG_MAX__LONG_LONG_MAX__# endif# ifndef ULLONG_MAX#  define ULLONG_MAX(LLONG_MAX * 2ULL + 1)# endif#endif#ifdef__USE_POSIX/* POSIX adds things to <limits.h>.  */# include <bits/posix1_lim.h>#endif#ifdef__USE_POSIX2# include <bits/posix2_lim.h>#endif#ifdef__USE_XOPEN# include <bits/xopen_lim.h>#endif

 

64位下的
limits.h

/* *ISO C99 Standard: 7.10/5.2.4.2.1 Sizes of integer types<limits.h> */#ifndef _LIBC_LIMITS_H_#define _LIBC_LIMITS_H_1#include <features.h>/* Maximum length of any multibyte character in any locale.   We define this value here since the gcc header does not define   the correct value.  */#define MB_LEN_MAX16/* If we are not using GNU CC we have to define all the symbols ourself.   Otherwise use gcc's definitions (see below).  */#if !defined __GNUC__ || __GNUC__ < 2/* We only protect from multiple inclusion here, because all the other   #include's protect themselves, and in GCC 2 we may #include_next through   multiple copies of this file before we get to GCC's.  */# ifndef _LIMITS_H#  define _LIMITS_H1#include <bits/wordsize.h>/* We don't have #include_next.   Define ANSI <limits.h> for standard 32-bit words.  *//* These assume 8-bit `char's, 16-bit `short int's,   and 32-bit `int's and `long int's.  *//* Number of bits in a `char'.*/#  define CHAR_BIT8/* Minimum and maximum values a `signed char' can hold.  */#  define SCHAR_MIN(-128)#  define SCHAR_MAX127/* Maximum value an `unsigned char' can hold.  (Minimum is 0.)  */#  define UCHAR_MAX255/* Minimum and maximum values a `char' can hold.  */#  ifdef __CHAR_UNSIGNED__#   define CHAR_MIN0#   define CHAR_MAXUCHAR_MAX#  else#   define CHAR_MINSCHAR_MIN#   define CHAR_MAXSCHAR_MAX#  endif/* Minimum and maximum values a `signed short int' can hold.  */#  define SHRT_MIN(-32768)#  define SHRT_MAX32767/* Maximum value an `unsigned short int' can hold.  (Minimum is 0.)  */#  define USHRT_MAX65535/* Minimum and maximum values a `signed int' can hold.  */#  define INT_MIN(-INT_MAX - 1)#  define INT_MAX2147483647/* Maximum value an `unsigned int' can hold.  (Minimum is 0.)  */#  define UINT_MAX4294967295U/* Minimum and maximum values a `signed long int' can hold.  */#  if __WORDSIZE == 64#   define LONG_MAX9223372036854775807L#  else#   define LONG_MAX2147483647L#  endif#  define LONG_MIN(-LONG_MAX - 1L)/* Maximum value an `unsigned long int' can hold.  (Minimum is 0.)  */#  if __WORDSIZE == 64#   define ULONG_MAX18446744073709551615UL#  else#   define ULONG_MAX4294967295UL#  endif#  ifdef __USE_ISOC99/* Minimum and maximum values a `signed long long int' can hold.  */#   define LLONG_MAX9223372036854775807LL#   define LLONG_MIN(-LLONG_MAX - 1LL)/* Maximum value an `unsigned long long int' can hold.  (Minimum is 0.)  */#   define ULLONG_MAX18446744073709551615ULL#  endif /* ISO C99 */# endif/* limits.h  */#endif/* GCC 2.  */#endif/* !_LIBC_LIMITS_H_ */ /* Get the compiler's limits.h, which defines almost all the ISO constants.    We put this #include_next outside the double inclusion check because    it should be possible to include this file more than once and still get    the definitions from gcc's header.  */#if defined __GNUC__ && !defined _GCC_LIMITS_H_/* `_GCC_LIMITS_H_' is what GCC's file defines.  */# include_next <limits.h>#endif/* The <limits.h> files in some gcc versions don't define LLONG_MIN,   LLONG_MAX, and ULLONG_MAX.  Instead only the values gcc defined for   ages are available.  */#if defined __USE_ISOC99 && defined __GNUC__# ifndef LLONG_MIN#  define LLONG_MIN(-LLONG_MAX-1)# endif# ifndef LLONG_MAX#  define LLONG_MAX__LONG_LONG_MAX__# endif# ifndef ULLONG_MAX#  define ULLONG_MAX(LLONG_MAX * 2ULL + 1)# endif#endif#ifdef__USE_POSIX/* POSIX adds things to <limits.h>.  */# include <bits/posix1_lim.h>#endif#ifdef__USE_POSIX2# include <bits/posix2_lim.h>#endif#ifdef__USE_XOPEN# include <bits/xopen_lim.h>#endif

原创粉丝点击