符号整型的陷阱

//看似死循环的背后,隐藏的是符号整型的陷阱,其实我们需要从理论上证实这一点
//这不是一个死循环
#include<iostream>
using namespace std;
int main()
{
  int x;
  int y=0;
  for(x=0;x<10;x++)
  {
   y=y+x;//x累加到4的时候,程序没有达到10,与此同时,检测到y即将大于10,x相互抵消,维持原值
  //导致死循环,但是居然程序能结束,太神奇了。
  if(y>10)
   x--;
  }
  return 0;
}
int main()
{
  int x ;
  int y=0;;//默认等价于符号整型 signed int 最大值是2147483647,最小值是一个负值 -2147483647
  for(x=0;x<10;x++)
  {
   y=y+x;//当y一直增加到最大值是2147483647,y再次增加将会变成一个负值,此时经过累加之后,x将会达到10退出循环,所以如果是一
个死循环的话,应该是一个无符号整型y
   if(y>10)
   x--;
  }
cout<<"x="<<x<<"  y="<<y<<endl;
  return 0;
}
结果:
x=10 y=-2147483616

如下是整个演算的过程:

准备知识:

1)int 默认是符号整型,最大值:2147483647

2)符号整型的最小值是:-2147483648

整个过程类似如下:

x  0 1 2 3 4 5 5 5 5 5...............6 7 8 9 10

y  0 1 3 6 10 15 20 25 30

从上面可以看出从5开始不断的加5,一直到整数的2147483645,这个时候加5就会变成负值-2147483646,  6的时候:40   7的时候,33   8的时候,25  9的时候,16

时间: 2024-11-09 06:17:19

符号整型的陷阱的相关文章

有符号和无符号整型数字

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

[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

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

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

无符号整型与有符号整型相运算规则

有符号数和无符号数运算的时候,有符号数会自动向无符号数转换 1 #include<iostream> 2 #include<ctime> 3 #include <stdio.h> 4 #include<cstring> 5 #include<cstdlib> 6 #include <map> 7 #include <string> 8 using namespace std; 9 10 #if TEST 11 int ma

【C语言位运算的应用】如何按bit位翻转一个无符号整型

其实现思路如下: 将目标数值进行末尾比特位摘取,将所摘取的bit位放到一个相同类型的末尾,目标数值bit位右移,相同类型bit位左移. C语言的位运算符:     实现代码如下: #include <stdio.h>//按位翻转一个无符号整形 unsigned int reverse_bit(unsigned int value) { unsigned int num = 0; int i = 0; for (i = 1; i < 32; i++) { num += value &

无符号整型指定比特位置1

将无符号数的指定比特进行置1.输入数字n(31bit,无符号整形),置为数m(0<=m<=31). 输入:无符号数,指定bit位 输出:指定的bit位被置1的值 例如:输入 891 7 输出 1019 1 #include <stdio.h> 2 #include <stdlib.h> 3 int main(void) 4 { 5 unsigned int c, tmp; 6 int d; 7 while (1) 8 { 9 scanf("%d%d"

无符号整型unsigned int、unsigned long、usigned long long、size_t比较和格式控制

位数比较 由于数据的长度和平台相关,所以基于 64 位系统比较. Windows Linux unsigned int 32 bits/4294967295 32 bits unsigned long 32 bits 64 bits/18446744073709551615 unsigned long long 64 bits 64 bits size_t 32 bits 64 bits 可以看到,size_t 和 unsigned long 比较同步.另外 ssize_t 和 size_t 的

JavaScript 32位整型无符号操作

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

GOLANG 基本数据类型 整型

基本数据类型-整型 种类 有符号(负号) int8 int16 int32 int64 无符号(无符号) uint8 uint16 uint32 uint64 架构特定(取决于系统位数) int uint 类型别名 Unicode字符rune类型等价int32 byte等价uint8 特殊类型 uintptr,无符号整型, 由系统决定占用位大小,足够存放指针即可,和C库或者系统接口交互 取值范围 具体类型 取值范围 int8 -128到127 uint8 0到255 int16 -32768到3