C语言有符号加减溢出

sizeof(short int ) = 2;

测试用例

#include <stdio.h>

int main()
{
    short int a = -32768;
    short int b = 0x8000;
    short int c = 0xffff;
    short int d = 0x8001;
    printf("%d, %d, %d, %d\n", a, b, c, d);
    a -= 1;
    b -= 1;
    c -= 1;
    d -= 1;
    printf("%d, %d, %d, %d\n", a, b, c, d);

    return 0;
}

结果:

b, c, d的表示均为16进制表示,即机器的存储形式, 补码表示

负数溢出计算 

理解一:(按机器存储来看,存储均为补码形式)

a 的补码形式(存储形式)为 1000 0000 ... 0000       a-1机器存储为 01111...1  为 32767的补码

理解二:(如下图)

a为最大负数, a -1 = a+ 2^32 - 1  = -32768 + 65536 -1 = 32767

图 一

b:  0xffff 为 -1的补码形式

补充:

short int 最大正数为 32767

测试 37267 + 1 = 01111...1 +1 = 100...0  (为 -32768的补码)

所以

short int a = 32767;

a += 1;

printf("%d\n", a); // -32768 从 图 一 同样可以看出

C语言有符号加减溢出,布布扣,bubuko.com

时间: 2024-11-04 13:36:11

C语言有符号加减溢出的相关文章

Java Integer Addition Subtration Overflow 整数加减溢出

leetCode有道题Reverse Integer,因为int的最大值为2的31次方减一,最小值为-2的31次方. 我一开始的代码将res递归加放在try中,以为溢出会有异常,然而并没有. 因为出传入的参数为int类型,且内存和时间要求都能满足,所以long存放中间结果足够了.leet上有个哥们用了一种更机智的溢出检测(自己去看:D) 我的代码: public class Solution { public int reverse(int x) { if(x<=9&&x>=-

加/减/乘/除四则混合运算(C 语言)

逆波兰表达式(也称为后缀表达式) C 语言简单实现,(也称为后缀表达式) 本示例旨在展示逆波兰表达式原理,作简单的混合运算,不作容错处理也不保证结果,若混合运算字符串中有负数等,自行调试解决 列如计算: 20.5+(100-(3+2)*8)/(8-5) - 10 后缀表达式为:20.5 100 3 2 + 8 * - 8 5 - / 10 - + C  语言代码如下: #include <stdio.h> #include <stdlib.h> #include <strin

去除input[type=number]最右边的spinners(默认加减符号)

// 去掉input[type=number]默认的加减号 input[type='number'] { -moz-appearance:textfield; } input[type=number]::-webkit-inner-spin-button, input[type=number]::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; } input[type=number]有时会出现默认的加减spinne

SQL谜题(加减符号替代)

问题:将以下字符串”.1.2.3.4.5.6.7.8.9 = 1“中的符号点(.)更改为符号加(+)或符号(-),有多少种方法?请用SQL解决此问题 计算过程: CREATE TABLE #(VAL INT) INSERT INTO # SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION AL

【C语言】符号优先级

一. 问题的引出 今天看阿里的笔试题,看到一个非常有意思的题目,但是很容易出错. 题目:如下函数,在32bit系统foo(2^31-3)的值是: Int foo(int x) { return x&-x; } 解答:如果想要答对这道题目,首先要清楚C语言中符号的优先级别,负号(-)的优先级高于^,所以2^31-3=2^28,还有一个陷阱就是C语言中认为^为异或运算而不是幂函数,所以2^28=30,然后计算30 & -30得出结果.又因为计算机内存中的数据是以二进制的补码形式存在的,所以参与

表达式求值:从“加减”到“带括号的加减乘除”的实践过程

本文乃Siliphen原创,转载请注明出处:http://blog.csdn.net/stevenkylelee ● 为什么想做一个表达式求值的程序 最近有一个需求,策划想设置游戏关卡的某些数值,这个数值不是一个常量,而是根据关卡的某些环境数据套上一个计算表达式算出来的.这个需求无法用excel拖表预计算出,因为关卡的环境数据只有在游戏中才能产生,在excel制表时,这些都是未知的.作为程序员,我可以把计算表达式硬编码在代码中,但这个做法有缺陷,如果策划要修改计算表达式的话,只能通过我修改程序并

自己实现的原码、反码、补码、移码的表示与加减运算软件

项目背景:这是我在大二上计算机组成原理这门课时,老师布置了一个课外作业(可以加分),她的要求是做一个能实现原码.反码.补码.移码的表示以及模仿计算机补码做加减运算功能的网络版软件.为了加平时分,于是我用一周的时间粗略地自学下JavaScript,然后将上述功能实现了,虽然只是一个微乎其微的小项目,但对热爱编程的我来说,还是有很大的成就感,故写下此文章已作留念~~~ 下面是实现的页面效果: 下面是实现的JavaScript源码: <!--wenjan.htm--> <html> &l

浮点加减运算中左规右规问题

当尾数用二进制表示时,浮点规格化的定义是尾数M应满足:  1/2   ≤  |M|<1 显然对于正数而言,有M = 00.1φφ-φ:对于负数,其补码形式为11.0φφ-φ(即-0.0*******,左归).这样,当进行补码浮点加减运算时,只要对运算结果的符号位和小数点后的第一位进行比较:如果它们不等,即为00.1φφ-φ或11.1φφ-φ,就是规格化的数:如果它们相等,即为00.0φφ-φ或11.0φφ-φ,就不是规格化的数,在这种情况下需要尾数左移以实现规格化的过程,叫做向左规格化.规则是:

一道int与二进制加减题

int dis_data = 32769; if( dis_data > 0x7fff)  dis_data -= 0xffff; printf("%d\n",dis_data); 上面的dis_data 输出值会是多少?  初一看可能还看不出来,那就计算一下: 0x7fff转换为十进制为 32767,显然 dis_data > 0x7fff, 所以要执行 dis_data -= 0xffff;这一句代码. 现在dis_data = 32769, 那么 0xffff转换为十