变量定义类型长度的理解

1 字节 = 8位 
int型 2字节 = 16位

按VC++和C++的规定,int和long等长,都是32位的。short才是16位的。只有原始的C才定义int和short等长为16位。 

这个数据范围指的确实是具体 int的取值范围,但不是你理解的那样。 
现在以16位的short为例。 
首先必须清楚一个概念,计算机中存放的数据都是以二进制形式存放的。short存放的是整型数据,是用固定位数16个二进制位来表示一个整数,不足16位补0。 
比如125的二进制是1111101,那么在内存中存放就是 
0000 0000 0111 1101 

那么16个二进制位能够表示多少种不同的整数呢?稍微用点数学常识就知道,是2的16次方,也就是65536个不同的整数。所以对于无符号整数,unsigned short的范围就是0~65535。 
而为了表示负数,计算机用short的第一位作为符号位来表示正负。注意,计算机中是以补码的形式存放整数的。对于正数,补码是其本身;对于负数,其补码是对其绝对值的按位取反,再加1的结果。 
举个简单的例子: 
125是0000 0000 0111 1101 
-125计算过程: 
125是0000 0000 0111 1101 
按位取反,1111 1111 1000 0010 
再加1,1111 1111 1000 0011 
所以-125就是1111 1111 1000 0011。 
补码不是三言两语能讲得清楚的,楼主有个概念即可。 
我们发现,正数的补码首位都是0,负数的补码首位都是1。 
short有符号型的范围是-32768~32767。 

那么,如果超出了范围,会发生什么现象呢? 
很简单,这称为溢出。 
比如short a = 32768 
32768是1000 0000 0000 0000。还记得我讲过吗?正数的补码首位都是0,但这里首位为1,这是怎么回事呢?其实因为浪费了1位做符号位,short的有效位数只是15位而已,而2的15次方是32768,因此正数的范围是0~32767,32768超出了范围,计算机怎么处理呢?结果就是把它当作负数,根据补码计算它的原码。反过来即可 
1000 0000 0000 0000 减1, 
0111 1111 1111 1111 再按位取反, 
1000 0000 0000 0000 就是32768 
所以1000 0000 0000 0000表示-32768 
也就是说short a = 32768;把a输出来得到-32768楼主可以试验一下。 

再举一例: 
unsigned short a=65536; 
65536是1 0000 0000 0000 0000 注意这已经是17位了。计算机会自动截取后面的16位 
就是得到0000 0000 0000 0000,也就是0 
所以unsigned short a=65536;输出a得到0。 
明白了吗?
时间: 2024-12-07 07:50:09

变量定义类型长度的理解的相关文章

<28>【了解】10-枚举类型介绍及定义+【掌握】11-枚举变量变量定义和使用+【掌握】13-typedef定义新的类型+【掌握】15-宏的概念及无参宏定义方法+【掌握】16-有参宏定义和使用方法+【掌握】17-应用:使用有参宏求最大值+【掌握】18-typedef和#define的区别

[了解]10-枚举类型介绍及定义 枚举类型: C语言提供了一个种类型,这种类型的变量的取值被限定在一定的范围之内了 枚举类型的定义: enum 枚举类型名{ 枚举值1,枚举值2,.... }; 举例: 定义一个变量,保存一周的第几天 enum weekday{ zhouyi,zhouer,zhousan,zhousi,zhouwu ,zhouliu,zhouri }; 定义iPhone手机的颜色 关于枚举类型元素的命名习惯 enum iColor{kIcolorWhite,kIcolorBlac

【SAS BASE】定义固定长度的character变量的四种方法

INPUT语句 1 INPUT Food $; /*采用list-style input,字符型变量默认长度为8*/ 2 INPUT Food $1-10; /*采用column input,长度由列的数量决定*/ 3 INPUT Food $15.; /*采用formatted input,长度formatted中的数字决定*/ ASSIGNMENT语句(赋值):用户可通过Assignment语句定义新变量,其程度有第一个出现在该变量中的观测决定. LENGTH语句:在DATA步中使用Leng

Java线程工作内存与主内存变量交换过程及volatile关键字理解

Java线程工作内存与主内存变量交换过程及volatile关键字理解 1. Java内存模型规定在多线程情况下,线程操作主内存变量,需要通过线程独有的工作内存拷贝主内存变量副本来进行.此处的所谓内存模型要区别于通常所说的虚拟机堆模型: 2. 线程独有的工作内存和进程内存(主内存)之间通过8中原子操作来实现,如下图所示: 原子操作的规则(部分): 1) read,load必须连续执行,但是不保证原子性. 2) store,write必须连续执行,但是不保证原子性. 3) 不能丢失变量最后一次ass

《Effective C++》之条款26:尽可能延后变量定义式的出现时间

<Effective C++> 条款26:尽可能延后变量定义式的出现时间 只要你定义了一个变量而其类型带有一个构造函数和析构函数,那么当程序的控制流到达这个变量定义式时,你便得承受构造成本:当这个变量离开作用域时,你便得承受析构成本.即使这个变量最终并未被使用,仍需耗费这些成本,所以你应该尽量避免这种情形. 对于"尽可能延后"的理解: 不只应该延后变量多的定义,直到非得使用该变量的前一刻为止,甚至应该尝试延后这份定义直到能够给它初始实参为止.如果这样,不仅能够避免构造(析构

php-环境、变量定义与输出、变量用法

1.php环境 1.1lawp 1.2wamp l: linux  w: windows //系统 a: apache  a: apache //阿帕奇 m: mysql  m: mysql //数据库 p: php p: php //php 2.变量定义与输出 2.1定义与输出都得带$ 2.2 定义:$name="xxx"; 输出: echo $name; //输出变量 var_dump($name); //输出数组,并打印类型与长度 print_r($name); //输出数组 3

PHP变量定义和输出

php在定义变量和输出变量时,前面必须加$ 变量名区分大小写,函数不区分大小写,写代码时最好都是用小写,这样就不会出错了 变量定义: $name="小明"; 变量输出: echo($name);  //输出变量 var_dump($name);  //输出数组,打印类型和长度 print_r($name);   //输出数组 utf-8的编码下,一个中文字三个字符 gbk的编码下,一个中文二个字符 1 <!doctype html> 2 <html> 3 <

上课笔记第二十九天、mysql、mysql编译安装及组成、客户端、变量和类型

1.关系型数据库基础理论及MySQL数据库基础架构           关系型数据的基础理论                    文件系统上:最初所有的数据都存储于文件中,每次读取文件时需要把所有的块数据都加载到内存中,通过工具grep查询需要的数据,如果文件比较大(100万行),这时加载会很慢而且占用资源比较大. 数据管理软件:                             层次模型.网状模型.关系模型.对象-关系模型.非关系模型                     DBMS:

java中的变量定义

也可以先声明后赋值  自动类型转换 1.  目标类型能与源类型兼容,如 double 型兼容 int 型,但是 char 型不能兼容 int 型 2.  目标类型大于源类型,如 double 类型长度为 8 字节, int 类型为 4 字节,因此 double 类型的变量里直接可以存放 int 类型的数据,但反过来就不可以了 强制类型转换 例如,当程序中需要将 double 型变量的值赋给一个 int 型变量,该如何实现呢? 显然,这种转换是不会自动进行的!因为 int 型的存储范围比 doub

oracle--pl/sql变量定义----

一.变量介绍 在编写pl/sql程序时,可以定义变量和常量:在pl/sql程序中包括有: 1).标量类型(scalar) 2).复合类型(composite) --用于操作单条记录 3).参照类型(reference) --用于操作多条记录 4).lob(large object) 二.标量(scalar)--常用类型 1).在编写pl/sql块时,如果要使用变量,需在定义部分定义变量. pl/sql中定义变量和常量的语法如下: identifier [constant] datatype [n