unsigned 整型实现无溢出运算

  普通的 int 整型能表示的范围很有限,所以刷题时很多时候不得不用 long long 来存更大的数据。或者找出数列中某个只出现一次(或奇数次)的数(其余的数均出现两次 / 偶数次),用异或运算的经典题目,然而,如果数据范围不大的话,O(n) 的复杂度下,把第一次出现的所有数全加 / 乘起来,然后再减 / 除去第二次出现的 n - 1 个数(缺少的那个就是要求的数),原理是可以的,只是一般 OJ 出这样的题目必然不会让你用这种小学生的思维去做,所以会把数据设置得奇大,让你一累加必然溢出,更不用说乘了;然而,我发现,用无符号的整数貌似能避免这样的问题,因为它溢出后自动环回,就像自动取模一样,比如 unsigned int,对于溢出的运算,都会将结果对 1<<32 取模(实际上我也解释不清楚,组成原理没学好 o(╯□╰)o ),我写了个类似的程序发现好像真的是这样,虽说没有严格测试过:

 1 #include<cstdio>
 2 #include<cstring>
 3 typedef unsigned int ui;
 4 const ui inf = 0x3fffffff;
 5
 6 int main() {
 7     ui sum = 0, n, x;
 8     printf("inf = %u\n",inf);
 9
10     n = 300;
11     while(n--) {
12         sum += inf;
13         sum += inf / 2;
14         sum += inf - inf / 3;
15     }
16     printf("sum = %u\n",sum);
17
18     for(int i = 1; i <= 300; ++i) {
19         sum -= inf - inf / 3;
20         sum -= inf / 2;
21         sum -= inf;
22     }
23     printf("%u\n",sum);
24
25     return 0;
26 }

  运行结果如下:

时间: 2024-10-10 22:21:11

unsigned 整型实现无溢出运算的相关文章

基于 CPython 解释器,为你深度解析为什么Python中整型不会溢出

前言 本次分析基于 CPython 解释器,python3.x版本 在python2时代,整型有 int 类型和 long 长整型,长整型不存在溢出问题,即可以存放任意大小的整数.在python3后,统一使用了长整型.这也是吸引科研人员的一部分了,适合大数据运算,不会溢出,也不会有其他语言那样还分短整型,整型,长整型...因此python就降低其他行业的学习门槛了. 那么,不溢出的整型实现上是否可行呢? 不溢出的整型的可行性 尽管在 C 语言中,整型所表示的大小是有范围的,但是 python 代

C语言的整型溢出问题(转)

整型溢出有点老生常谈了,bla, bla, bla… 但似乎没有引起多少人的重视.整型溢出会有可能导致缓冲区溢出,缓冲区溢出会导致各种黑客攻击,比如最近OpenSSL的heartbleed事件,就是一个buffer overread的事件.在这里写下这篇文章,希望大家都了解一下整型溢出,编译器的行为,以及如何防范,以写出更安全的代码. 什么是整型溢出 C语言的整型问题相信大家并不陌生了.对于整型溢出,分为无符号整型溢出和有符号整型溢出. 对于unsigned整型溢出,C的规范是有定义的——“溢出

【C语言】整型溢出和整型提升

什么是整型溢出: C语言的整型问题相信大家并不陌生了.对于整型溢出,分为无符号整型溢出和有符号整型溢出. 对于unsigned整型溢出,C的规范是有定义的--"溢出后的数会以2^(8*sizeof(type))作模运算",也就是说,如果一个unsigned char(1字符,8bits)溢出了,会把溢出的值与256求模.例如: unsigned char x = 0xff; printf("%d\n", ++x); 上面的代码会输出:0 (因为0xff + 1是25

shortlong能够应用到整型shortint或short短整型

得到扩大的数据类型.,unsign能够应用到整型和字符型:ongint或long长整型unsignint 无符号整型unsignshort无符号短整型unsignlong无符号长整型unsignchar无符号字符型C言语的根本数据类型有以下几个 :int整型char字符型float单精度浮点型doubl双精度浮点型别的.> 整型    C标准没有规定各类数据所占内存字节数,一般一个int型数据所占内存与计算机字长巨细一样,为16位或32位 ,short型数据一般占16位,long型数据是32位.

JavaScript 32位整型无符号操作

在 JavaScript 中,所有整数字变量默认都是有符号整数,这意味着什么呢? 有符号整数使用 31 位表示整数的数值,用第 32 位表示整数的符号,0 表示正数,1 表示负数. 数值范围从 -2^31 - 2^31-1 即 -2147483648 到 2147483647. JavaScript 进行位操作时,是采用32位 有符号 整型,这意味着其转换的结果也是32位有符号整型. 有些时候,我们进行移位会出现意想不到的结果,以下是C语言 与 JS 的对比. C语言 1 unsigned in

uint8是8位无符号整型,uint16是16位无符号整型。

整型有无符号(unsigned)和有符号(signed)两种类型,在默认情况下声明的整型变量都是有符号的类型(char有点特别),如果需声明无符号类型的话就需要在类型前加上unsigned.在一些不可能取值为负数的时候,可以定义为unsigned,在一些底层的嵌入式编程的数据一般都是无符号. 向左转|向右转 扩展资料: 负数时的有符号整型和无符号整型的转换 当执行一个运算时(如这里的a>b),如果它的一个运算数是有符号的而另一个数是无符号的,那么C语言会隐式地将有符号 参数强制类型为无符号数,并

[C/C++]如何将一个无符号整型所有数据位置为1

正解「x = -1;」 -1超出无符号整型x的表达范围,根据标准(C++11 section 4.7.2),-1将被转化为2^n-1(n为x的bit数). 不正解 「x = 0xFFFFFFFF;」 这只适用于32bit整型. 不正解「x = ~0;」 这个被很多书认定为「标准答案」的解答也是错的.C/C++标准支持原码/反码/补码三种负数表示形式,只有在补码环境下才会得到正确结果.(例如在反码下,~0将得到-0,-0转为无符号仍然是0) 那么x = ~0u呢? 仍然是错的.根据标准(C++11

C#位运算实际作用之操作整型某一位

1.前言 前几天写了两篇关于c#位运算的文章 c#位运算基本概念与计算过程 C#位运算实际运用 在文中也提到了位运算的实际作用之一就是合并整型,当时引用了一个问题: C# 用两个short,一个int32拼成一个long型,高16位用short,中间32位用int,最低16位用另外一个short. 答案如下: 高16位shortA.中间32位intA.低16位shortB longResult=((long)shortA << 48 )+ ((long)intA << 16)+ s

有符号和无符号整型数字

8位无符号整型:0 -> 25511111111     255...10000000     12801111111     127...00000000       0 8位有符号整型:-128 -> 12701111111    127...00000000      011111111     -1        取反加一...10000000   -128        取反加一