位操作数据溢出的结果

看一些有关位操作的知识,这里为了方便说明,拿short(16位)作为例子:

先说signed short带符号的,表示的范围是-215~215-1也就是-32768~32767。

那么对于下面的代码:

short a = -32768;
a = a - 1;

  这里的a的最后值是多少呢?

先看a=-32768的二进制表示,1000 0000 0000 0000,a-1的操作就直接在二进制上操作,就是简单的小学运算:

然后你按照short类型去读取这个值,那么得到的结果就是32767,看到了吗?从最小的值减1变到了最大的值。

那么这个样子呢:

short a = 32767;
a = a + 1;

  同理还是小学运算:

运算之后的结果是-32768,从最大值+1变到了最小值。

总结:对于有符号的数字,他们表示的范围就是一个环,每次+1,结果增加1,当增加到最大值以后再增加1,就回到最小值。同理最小值再继续减1,就回到了最大值。

无符号的数字和有符号的同理,比如说unsigned short这个类型的数字,表示的范围是0~65535,那么最大值+1就变成了0。最小值0减一就变成了最大值65535。

总结:对于内存数字的加法和减法都是进行的小学生运算,但是运算之后的结果是什么,那要看你用什么数据类型去解析它。

时间: 2024-11-09 00:44:22

位操作数据溢出的结果的相关文章

[位操作]数据位提升的隐式转换

有关数据位的提升的隐式转换从下面的这三道道笔试题开始: signed char a = 0xe0; unsigned int b = a; unsigned char c = a; signed char a = 0xe0; if(a == 0xe0) { printf("haha"); } else { printf("nono"); } unsigned int a = 6; int b = -20; (a + b > 6) ? printf("

c语言位域的使用注意事项——数据溢出

c语言可以使用位域来节省变量的空间,例如开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位.位域的取值范围非常有限,数据稍微大些就会发生溢出,这个字使用keil的使用,keil提示,溢出的警告, 因此不能忽视keil的任何警告,否则数据溢出了,你代码的功能是完不成的. struct pack{unsigned a:12;  unsigned  :20;//该位域成员不能使用,用于填充unsigned c:6;  }; 另一种是可以拿来填充,因为存在内存对齐的原因. 原文地址

Int数据溢出的检查 leetcode7

Int数据溢出的检查 leetcode7 一.题目: 7. 整数反转 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意: 假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1].请根据这个假设,如果反转后整数溢出那么就返回 0. 二.解答: 方法: 需要知道int型数据的范围——int类型是3

Java中的基本类型转换,数据溢出原理

java中的数据类型 java是一种强类型语言,在java中,数据类型主要有两大类,基本数据类型和引用数据类型,不同的数据类型有不同的数据存储方式和分配的内存大小. 基本数据类型中,各数据类型所表示的范围也是不一样的,如下所示: 由于在java中,整数默认是采用int型,浮点数默认采用的是double型进行存储,所以在定义long型和float型数据时,必须在数值后面加'l','L'和'f','F',如: 1 long a = 1000l; 2 long b = 2000L; 3 float c

打印从1到n位数(防止数据溢出)

1 package LeetCode; 2 3 /*打印N位最大数据*/ 4 public class PrintToMaxOfDigits { 5 6 public static void main(String[] args) throws Exception { 7 // TODO Auto-generated method stub 8 PrintToMaxData(0); 9 } 10 public static void PrintToMaxData(int n) throws Ex

C语言变量定义与数据溢出(初学者)

1.变量定义的一般形式为:类型说明符.变量名标识符等:例:int a,b,c;(abc为整型变量) 在书写变量定义时应注意以下几点: (1)允许在一个类型说明符后,定义多个相同类型的变量.各变量之间用","间隔.类型说明符与变量名之间用一个空格间隔. (2)最后一个变量之后必须以":"结尾. (3)变量定义必须放在变量使用之前,一般放在函数体的开头部分. 注:有符号整型遇无符号整型会统一变为有符号整型. 2.整型数据的溢出: #include <stdio.h

JAVA之数据溢出

Integer在java中属于包装类,既能用于字符串与整型的转换,也能用于拆箱与装箱 package ABC; public class A{ public static void main(String[] args) { // TODO Auto-generated method stub //得到整形的最大值 int max=Integer.MAX_VALUE; //输出最大值 System.out.println("整形的最大值是"+max); //最大值加1 System.o

java基础:强制转化数据溢出后结果计算

结果为-126 以下为分析过程

[LeetCode]位操作有关的算法设计

在进行位操作算法设计之前,先了解位操作的一些细节知识点: 1. 位操作数据溢出的结果 2. 数据位提升的隐式转换 http://www.cnblogs.com/grandyang/p/4606334.html