17.3.10--->关于数值溢出问题

取值范围:

short、int、long 占用的字节数不同,所能表示的数值范围也不同。以32位平台为例,下面是它们的取值范围:

数据类型                             所占字节数          取值范围
short                                       2               -32768~32767,即 -215~(215-1)
unsigned short                         2                0~65535,即 0~(216-1)
int                                           4                 -2147483648~2147483647,即 -231~(231-1)
unsigned int                             4                 0~4294967295,即0~(232-1)
long                                         4                 -2147483648~2147483647,即 -231~(231-1)
unsigned long                           4                    0~4294967295,即0~(232-1)

当数值过大或过小时,有限的几个字节就不能表示,就会发生溢出。发生溢出时,最高位会被截去

#include <stdio.h>
int main()
{
    unsigned int a = 0x100000000;
    int b = 0xffffffff;
    printf("a=%u, b=%d\n", a, b);
    return 0;
}

运行结果:
a=0, b=-1

变量 a 为 int 类型,占用4个字节(32位),能表示的最大值为 0xFFFFFFFF,而 0x100000000 = 0xFFFFFFFF + 1,占用33位,已超出 a 所能表示的最大值,会发生溢出,最高位被截去,剩下的32位都是0。也就是说,在 a 被输出前,其值已经变成了 0。

对于变量 b,每一位的值都是 1,包括符号位,以 %d 输出时,按照推理应该是 -0x7fffffff = -2147483647,但是输出结果却是 -1,这是为什么呢?

明天写解答

时间: 2024-12-27 16:49:29

17.3.10--->关于数值溢出问题的相关文章

Python练习题 041:Project Euler 013:求和、取前10位数值

本题来自 Project Euler 第13题:https://projecteuler.net/problem=13 # Project Euler: Problem 13: Large sum # Work out the first ten digits of the sum of the following one-hundred 50-digit numbers. # Answer: 5537376230 numbers = '''371072875339021027987979982

leecode 278 数值溢出感想

278是一道很简单的题,二分查找而已. 不过它却提醒了我一个很重要的事情,数值溢出问题. int begin, end; 乍一看 (begin + end) / 2 与 begin + (end - begin) /2 没什么区别. 可是 前者可能溢出,后者却不会溢出. 所以尽量用begin + (end - begin) /2. 由此推想, 所有的加法,减法,乘法都可能造成溢出. 有精巧的设计固然重要,可最重要的是在做数值运算时清楚数值的范围.

数值溢出与精度损失

数值溢出与精度损失 整数上溢出 进位超过最高位(无符号)或改变了符号位(有符号) 运算溢出.赋值溢出.无符号数小数减大数 浮点数的上溢出和下溢出 舍入 int=float float=double float=long 浮点数使用阶码储存 float 23位尾数 6~7位 double 52位尾数 16位 二进制小数与十进制小数并不是一一对应的 两个数量级相差很大的浮点数加减运算时,数值小的会被忽略 个人网站:DiffidentAres's Blog 原文地址:https://www.cnblo

17.2.10 NOIP模拟赛 藏妹子之处(excel)

藏妹子之处(excel) 问题描述: 今天CZY又找到了三个妹子,有着收藏爱好的他想要找三个地方将妹子们藏起来,将一片空地抽象成一个R行C列的表格,CZY要选出3个单元格.但要满足如下的两个条件: (1)任意两个单元格都不在同一行. (2)任意两个单元格都不在同一列. 选取格子存在一个花费,而这个花费是三个格子两两之间曼哈顿距离的和(如(x1,y1)和(x,y2)的曼哈顿距离为|x1-x2|+|y1-y2|).狗狗想知道的是,花费在minT到maxT之间的方案数有多少. 答案模100000000

17.2.10 NOIP模拟赛 聪哥的工资

聪哥的工资 (money/money.in/money.out) 时限1000ms 内存256MB 题目描述 lwher: 了体验劳苦大众的生活,聪哥在暑假参加了打零工的活动,这个活动分为n个工作日,每个工作日的工资为Vi.有m个结算工钱的时间,聪哥可以自由安排这些时间,也就是说什么时候拿钱,老板说的不算,聪哥才有发言权! (因为聪哥是土豪,他是老板的老板,你觉得老板敢给聪哥安排任务吗?所以聪哥的工作就是看心情去拿钱拿完就走人啦...) 聪哥不喜欢身上一次性有太多的钱,于是他想安排一下拿钱的时间

dotnet core 中数值溢出

.net core中使用C#的int类型,存在数值上下限范围,如下: int max = int.MaxValue; int min = int.MinValue; Console.WriteLine($"The range of integers is {min} to {max}"); 运行得到结果 The range of integers is -2147483648 to 2147483647 此时如果执行以下代码 int what = max + 3; Console.Wr

C:数值溢出问题

当超过一个数据类型能够存放最大的范围时,数值会溢出. 有符号位最高位溢出的区别:符号位溢出会导致数的正负发生改变,但最高位的溢出会导致最高位丢失. #include <stdio.h> int main() { char ch; //符号位溢出会导致数的正负发生改变 ch = 0x7f + 2; //127+2 printf("%d\n", ch); // 0111 1111 //+2后 1000 0001,这是负数补码,其原码为 1111 1111,结果为-127 //最

17.11.10 全是模板的一上午

大米饼的左偏树 #include<iostream> #include<cstdio> #define N 1000005 using namespace std; int n,m,fa[N],l[N],r[N],d[N],v[N]; bool die[N]; int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);} int merge(int x,int y) { if(!x)return y;if(!y)return x;//树

softmax数值溢出 与 softmax-loss问题

1.在阅读tensorflow源码的softmax实现过程中,可以看到它的实现有两个特殊地方: ①计算e指数的时候,所有logits都减去了每行的最大值 ②其softmax_op_functor.h中,可以看到根据传入的log参数不同分别有两种不同计算方法.log为true时,计算LogSoftmax,log为false时,计算Softmax 其中这两个特殊的地方一个是为了解决数值上溢的问题,一个是解决数值下溢的问题. 具体参考:https://www.codelast.com/%E5%8E%9