int的范围问题

32位的int 的范围为 -2^31 ~ 2^31-1。以下讨论的均是32位的有符号整数,最高位为符号位。

int main(){
    int s1 = 0x80000000;
    int s2 = 0x7fffffff;
    int s3 = 0xffffffff;
    cout << "int最小值" << s1 << endl;
    cout << "int最大值" << s2 << endl;
    cout << "注意:" << s3<<endl;
    system("pause");
}

求源码的补码为 :

(1)正数的补码和原码相同

(2)负数的补码=保持最高的符号位不变,其余位取反+1

但是

int s1=0x 8000 0000和 int s1=8这种方式有所区别:

计算机中存的是补码:

所以对于

int s1=8 这种方式,首先求8的补码存储到计算机中,然后输出的时候再还原回来。

然而对于

in s1= 0x ffff ffff 计算机中直接存的就是 0x ffff ffff 并不需要求 0x ffff ffff的补码,0x fffff ffff是以补码的形式直接存储到计算机中的。

因此对于

int s1= 0x ffff ffff,计算机中存储的是 0x ffff ffff ,输出的时候,需要将其还原回来

注意计算机存储的是0x ffff ffff是以补码的形式存储的,因此输出的是必须再还原回来:

0x ffff ffff的补码是  0x 8000 0001 ,最高位是符号位,因此输出的是-1

int的最小值在计算机中存储的为何存储的是0x 8000 0000 呢?(注意最高位的符号位不参与运算,相当于标志位)

因为 输出的时候 对 0x 8000 0000 取补码,注意最高位是符号位,不参与运算, 因此对于剩下的31位,  0x 000 0000 取反加1后得到的是 0x 8000 0000

和最高位的符号位,加起来是 0x 1 8000 0000 溢出了,截取1位得到的是 0x 8000 0000 是-0 但是 已经有0的存储方式了,是0x 0000 0000不需要有-0这种的存储方式,因此虽然截取掉了溢出的位,但是实际计算了最高位,这里是计算机为了表示更小的数做的特殊处理,因此实际上这里 表示的 是 0x 1 8000 0000而不是 0x 8000 0000,那 0x 1 8000 0000的最高位是 1表示负数,0x 8000 0000 的值是 2^31,合起来表示的就是 -2^31.

时间: 2024-10-10 16:14:29

int的范围问题的相关文章

numeric and int in sql server

类型映射 https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-data-type-mappings C#关键字 decimal https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/decimal The decimal keyword indicates a 128-bit data type. Compa

mysql中int、bigint、smallint和tinyint的区别与长度

对比发现 int bigint smallint 和 tinyint 类型,如果创建新表时没有指定 int(M) 中的M时,默认分别是 : int             -------     int(11) bigint       -------     bigint(20) smallint   -------     smallint(6) tinyint     -------     tinyint(4) 下面是这几种类型的取值范围 参考:http://www.2cto.com/d

int、str、list、tuple、dict补充

一.int a = 123 b = a# a与b指向同一个地址值 c = 123 d = 123 e = 123 #d.c.e当在-5~257这个范围时,都指向一个地址值(Python优化的结果,当超出这个范围,id与之不同) 二.str a. name = "你猜" for i in name: print(i) bytes_name = bytes(i, encoding='utf-8')# 字符转换成字节 print(byte_name)# 16进制表示 for byte in

Java进阶(三十四)Integer与int的种种比较你知道多少?

Java进阶(三十四)Integer与int的种种比较你知道多少? 前言 如果面试官问Integer与int的区别:估计大多数人只会说到两点:Ingeter是int的包装类,注意是一个类:int的初值为0,Ingeter的初值为null.但是如果面试官再问一下Integer i = 1;int ii = 1; i==ii为true还是为false?估计就有一部分人答不出来了,如果再问一下其他的,估计更多的人会头脑一片混乱.所以我对它们进行了总结,希望对大家有帮助. 首先看代码: package

C# 与数据库中字段类型 Int16(short), Int32(int), Int64(long)的取值范围、区别 。string长度

一开始看到Int16, Int32, Int64这三种类型就觉得有点怪, 为什么要整个数字结尾的, 挺怪的. 昨天互相想到, ms这么干就是想让大家一眼就知道这个数据类型占多大空间吧. Int8, 等于byte, Int16, 等于short, 占2个字节. -32768 32767 Int32, 等于int, 占4个字节. -2147483648 2147483647 Int64, 等于long, 占8个字节. -9223372036854775808 9223372036854775807

C/C++中各种类型int、long、double、char表示范围(最大最小值)(转)

1 #include<iostream> 2 #include<string> 3 #include <limits> 4 using namespace std; 5 6 int main() 7 { 8 cout << "type: \t\t" << "************size**************"<< endl; 9 cout << "bool: \t

mysql中bigint、int、mediumint、smallint 和 tinyint的取值范

mysql数据库设计,其中,对于数据性能优化,字段类型考虑很重要,搜集了些资料,整理分享出来,这篇为有关mysql整型bigint.int.mediumint.smallint 和 tinyint的语法介绍,如下:1.bigint 从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字),无符号的范围是0到 18446744073709551615.一位为 8 个字节. 2.int 一个正常大小整数.有符号

Reverse Integer - 反转一个int,溢出时返回0

Reverse Integer Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 若反转的数溢出,直接返回0 可以用计算结果来判断溢出,也可以用因数来判断 Java代码实现: 1 public class ReverseInteger { 2 public static int reverseInt(int x){ 3 if (x == 0) { 4 return

Int.Parse与ConvertToInt的区别

最近在公司做一个项目的时候,在某次 跟组长讨论的时候.对一个简单的线发生了一些讨论.感觉挺有收获的.现在来总结一下. 在代码开发的时候,底层代码,不要写try-catch.因为写异常处理之后,代码的执行效率会大大的降低.底层的代码,不写异常,但是要经过严格的测试,确保正确.而对于界面层来说,必须接收异常.程序崩溃是非常不友好的.而且也降低了用户对你程序的信任. 对几个小问题的整理: 1.try-catch是否影响效率 自己简单测试了一下,感觉不到效率有什么变化. 然后查找一系列相关博客.发现了一

华为刀片,IBM刀片服务器将外部EXT端口流量复制给内部INT端口的实现方法不同

如何在刀片服务器中将外部端口EXT的流量复制给内部INT端口用于采集DNS流量 (1)对于IBM刀片服务器的北电Nortel_32R1860交换模块112.4.20.12DNS抓包的问题已经搞定 经过摸索和测试,感觉北电的交换机模块不是采用镜像命令来实现复制流量(虽然有相应的port-mirroring monitor-port...命令,但并不生效),而应该是在相同vlan就可以复制流量,如果要把ext3的流量复制给int14,只要把ext3和int14放在同一个vlan11下,都不打tagg