-
2022-04-07 19:01:04
在PyCharm中测试下面的代码:
# 计算1x2x3x...x100: acc = 1 n = 1 while n <= 100: acc = acc * n n = n + 1 print(acc)
打印结果如下:
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
居然没有溢出, 这让我挺意外! 那么Python中整型变量的长度到底是多少呢? 为什么能容纳这么大的数值呢? C语言和Java语言中整型变量一般为4字节或8字节, 对于C和Java来说存储这么大的数值早就应该溢出了. 看来Python在这一点上与C和Java是不同的。
使用下面的代码打印一下acc, 0以及1的字节数:
print(sys.getsizeof(acc)) print(sys.getsizeof(0)) print(sys.getsizeof(1))
结果分别是96, 24, 28.
还是不太理解这是为什么, 网上查了下答案,这与Python底层保存整型变量的结构有关系,Python底层保存整型变量的结构如下:
struct PyLongObject{
long ob_refcnt; // 引用计数,64位系统占8 bytes, 32位系统占4 bytes
struct_typeobject *ob_type; // 类型指针,64位系统占8 bytes, 32位系统占4 bytes
long ob_size; // 数据部分int的个数,64位系统占8 bytes, 32位系统占4 bytes
unsigned int ob_digit[1]; // 64位系统占4 bytes * abs(ob_size); 32位系统占2 bytes * abs(ob_size);
};对于64位Python:
ob_refcnt,ob_type,ob_size各占8字节。当ob_size为0时,ob_digit不存在,否则其字节数为4*abs(ob_size),所以最少为8*3=24字节,而且每次增量都是4的倍数。
对于32位Python:
ob_refcnt,ob_type,ob_size各占4字节。当ob_size为0时,ob_digit不存在,否则其字节数为2*abs(ob_size),所以最少为4*3=12字节,而且每次增量都是2的倍数。
采用这种处理方式,Python的整型变量基本上可做到无长度限制。
更多相关内容 -
从低位开始取出长整型变量s中奇数位上的数依次构成一个新数放在t中
2022-02-08 21:08:48从低位开始取出长整型变量s中奇数位上的数依次构成一个新数放在t中 例如:当s中的数为:7654321时,t中的数为:7531 这里写两种简单的做法 第一种–通过数组 这里需要注意的就是因为获取长数字的数是从后往前取到...从低位开始取出长整型变量s中奇数位上的数依次构成一个新数放在t中
例如:当s中的数为:7654321时,t中的数为:7531
这里写两种简单的做法
第一种–通过数组
这里需要注意的就是因为获取长数字的数是从后往前取到数组里的,因此输出时需要逆序输出
int get_OddNum(long num,int *t) { int i = 0;//数组下标,也作为数组长度返回 while (num) { t[i++] = num % 10; num /= 100; //因为取的是奇数位 } return i; } void main() { long num = 7654321; int arr[5],len; len=get_OddNum(num,arr); for (int i = len-1; i >=0 ; i--)//逆序遍历数组输出 { printf("%d", arr[i]); } }
第二种–通过变量
如果不用数组,那么变量也可以实现倒着取数,把那个数拼好
举个例子,12345,如果我们要取后面的4和5,那么其实就是把5先拿出来存好,再取出4,拿它×10再加上5,得到45,如果再多数也只需要一个变量.那么是不是可以这么写了呢
int get_OddNum(long num) { int res = 0; int temp = 1; while (num) { res = num % 10 * temp + res; num /= 100; temp *= 10; } return res; } void main() { long num = 7654321; int res; res=get_OddNum(num); printf("%d", res); }
这里的res就是最后要的数,而temp就是用于乘多少个10的变量
很显然还是数组来的清晰明了
如有不足,还望指正
-
C语言编程>第二十二周 ⑦ 下列给定程序中函数fun的功能是:从低位开始取出长整型变量a中奇数位上的数,...
2021-02-02 10:01:04例题:下列给定程序中函数fun的功能是:从低位开始取出长整型变量a中奇数位上的数,依次构成一个新数放在b中。 例如,当a中的数为7654321时,则b中的数为7531。 注意:不要改动main函数,不能增行或删行,也不能更改...例题:下列给定程序中函数fun的功能是:从低位开始取出长整型变量a中奇数位上的数,依次构成一个新数放在b中。
例如,当a中的数为7654321时,则b中的数为7531。
注意:不要改动main函数,不能增行或删行,也不能更改程序的结构。
代码如下:
#include<conio.h> #include<stdio.h> void fun(long a,long*b) { long s1=10; *b=a%10; while(a>0) { a=a/100; *b=a%10*s1+*b; s1=s1*10; } } main() { long a,b; printf("\nPlease enter data:"); scanf("%ld",&a); fun(a,&b); printf("The result is:%ld\n",b); }
输出运行窗口如下:
本周其他练习C语言编程>第二十二周 ① 下列给定程序中,函数fun的功能是:找出一个大于给定整数n且紧随n的素数,并作为函数值返回。
C语言编程>第二十二周 ② 请补充fun函数,该函数的功能是:返回字符数组中指定字符的个数,指定字符从键盘输入。
C语言编程>第二十二周 ③ 下列给定的程序中,函数fun的功能是根据整型形参n,计算如下公式的值:
C语言编程>第二十二周 ④ 从键盘输入一组小写字母,保存在字符数组str中,请补充fun函数,该函数的功能是:把字符数组str中字符下标为偶数的小写字母转换成对应的大写字母,结果仍保存在原数组中。
C语言编程>第二十二周 ⑤ 下列给定程序中,函数fun的功能是:将字符串p中的所有字符复制到字符串a中,要求每复制三个字符之后插入一个空格。
C语言编程>第二十二周 ⑥ 请补充fun函数,该函数的功能是:把字符下标能被2和3同时整除的字符从字符串s中删除,把剩余的字符重新保存在字符串s中。
C语言编程>第二十二周 ⑦ 下列给定程序中函数fun的功能是:从低位开始取出长整型变量a中奇数位上的数,依次构成一个新数放在b中。
C语言编程>第二十二周 ⑧ 请补充fun函数,该函数的功能是:求100(不包括100)以内能被2或3整除,但不能同时被2和3整除的自然数。结果保存在数组a中,fun函数返回数组a元素的个数。
越努力越幸运!
加油,奥力给!!!
-
搞透C语言整型数据范围表示
2021-05-20 12:53:21(1)shortC语言中,short是定义一种整型变量家族的一种长度:依据程序编译器的不同short定义的字节数不同。标准定义short短整型变量不得低于16位,即两个字节。编译器头文件夹里面的limits.h定义了short能表示的大小...(1)short
C语言中,short是定义一种整型变量家族的一种
长度:
依据程序编译器的不同short定义的字节数不同。
标准定义short短整型变量不得低于16位,即两个字节。
编译器头文件夹里面的limits.h定义了short能表示的大小:SHRT_MIN~SHRT_MAX。在32位平台下如windows(32位)中short一般为16位。
若规定编译器规定short为2字节,则:
unsigned short i; i可以表示0~65535(0~2^16-1)
signed(默认)short i; i可以表示-32768~+32767(-2^(16-1)~2^(16-1)-1)
(2)int
C语言中,int是定义一种整型变量家族的一种。
长度:
目前在一般的电脑中,int占用4字节,32比特,数据范围为-2147483648~2147483647[-2^31~2^31-1]
在之前的微型机中,int占用2字节,16比特,数据范围为-32768~32767[-2^15~2^15-1]
unsigned int 表示无符号整数,数据范围为[0~2^32-1]
除了short、int类型之外,还有long、long long类型可以表示整数。
以下对范围求取进行说明。
图1
以8位进行说明,16位,32位,64位类似。
第一位为符号位,0正,1负。假定数据类型的长度为一个字节8位。对有符号整型进行说明。
(1)有符号
对于负数的下限,最高位作为符号位位1,用1 1 1 1 1 1 1 1,如图1所示。即为-127,而不是-128,
难道是1 0 0 0 0 0 0 0?其实就是用1 0 0 0 0 0 0 0表示-128的。以下进行说明。
注意:1000 0000 B 不等于0 而是 -128(图2)
+127 +1 = -128
即 0111 1111 B+1 = 1000 0000 B
也就是发生了 byte值溢出
8位二进制反码的表示范围:-127~+127
为什么 -128 的二进制会是1000 0000;
1000 0000 (原) = 1111 1111(反)
那么问题来了: 64+32+16+8+4+2+1 = 127 为什么会有128呢?
原来 负数 反码是需要补码的,也就是在最后得出的结果上 +1
注意:计算机中只有 +0 而不存在 -0的说法,因为-0是完全没有意义的存在(见下对正0负0的说明),
即:只有 0000 0000 = +0
而没有 1000 0000 = -0
1000 0000的真实身份是 -128
图2
需要了解计算机对数据的存储表示方法(原码、反码、补码),以及负0与正零的表示。
(1)所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
原码不能直接参加运算,可能会出错。例如数学上,1+(-1)=0,而在二进制中00000001+10000001=10000010,换算成十进制为-2。显然出错了。所以原码的符号位不能直接参与运算,必须和其他位分开,这就增加了硬件的开销和复杂性。为了解决原码做减法的问题,出现了反码:计算十进制的表达式: 1-1=01 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原=[0000 0001]反 + [1111 1110]反 =[1111 1111]反 = [1000 0000]原 =-0 发现用反码计算减法, 结果的真值部分是正确的. 。而唯一的问题其实就出现在"0"这个特殊的数值上.虽然人们理解上+0和-0是一样的。但是0带符号是没有任何意义的.而且会有[0000 0000]原和[10000000]原两个编码表示0.于是补码的出现,
反码是数值存储的一种,多应用于系统环境设置,如linux平台的目录和文件的默认权限的设置umask,就是使用反码原理。
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。负数的补码则是符号位为“1”。并且,这个“1”既是符号位,也是数值位。数值部分按位取反后再在末位(最低位)加1。也就是“反码+1”。
补码的出现,解决了0的符号以及两个编码的问题:1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 =[0000 0001]补 + [1111 1111]补 =[0000 0000]补=[0000 0000]原 ,这样0用[0000 0000]表示,而以前出现问题的-0则不存在了.而且可以用[10000000]表示-128:(-1) + (-127) = [1000 0001]原 + [1111 1111]原 =[1111 1111]补 + [1000 0001]补 =[1000 0000]补
-1-127的结果应该是-128,在用补码运算的结果中, [1000 0000]补 就是-128.但是注意因为实际上是使用以前的-0的补码来表示-128,所以-128并没有原码和反码表示.(对-128的补码表示[10000000]补算出来的原码是[0000 0000]原,这是不正确的)使用补码,不仅仅修复了0的符号以及存在两个编码的问题,而且还能够多表示一个最低数.
这就是为什么8位二进制,使用原码或反码表示的范围为[-127, +127],而使用补码表示的范围为[-128, 127].因为机器使用补码,所以对于编程中常用到的32位int类型,可以表示范围是: [-2^31, 2^31-1]因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值.
(2)根据原码的定义:正零和负零的原码为:
+0 : 0000 0000 0000 0000 0000 0000 0000 0000 (32 bit)
-0 : 1000 0000 0000 0000 0000 0000 0000 0000
而反码为:
+0 : 0000 0000 0000 0000 0000 0000 0000 0000
-0 : 1111 1111 1111 1111 1111 1111 1111 1111
补码为:
+0 : 0000 0000 0000 0000 0000 0000 0000 0000
-0 : 1 0000 0000 0000 0000 0000 0000 0000 0000
可以看出,-0的补码发生溢出,舍弃最高位后,其跟+0在内存的表示一样,都是:
0000 0000 0000 0000 0000 0000 0000 0000
再看看下面的图中所示错误。这个错误牵扯到一个叫模的概念。下面是解释。
1)模的概念:把一个计量单位称之为模或模数。例如,时钟是以12进制进行计数循环的,即以12为模。在时钟上,时针加上(正拨)12的整数位或减去(反拨)12的整数位,时针的位置不变。14点钟在舍去模12后,成为(下午)2点钟(14=14-12=2)。从0点出发逆时针拨10格即减去10小时,也可看成从0点出发顺时针拨2格(加上2小时),即2点(0-10=-10=-10+12=2)。因此,在模12的前提下,-10可映射为+2。由此可见,对于一个模数为12的循环系统来说,加2和减10的效果是一样的;因此,在以12为模的系统中,凡是减10的运算都可以用加2来代替,这就把减法问题转化成加法问题了(注:计算机的硬件结构中只有加法器,所以大部分的运算都必须最终转换为加法)。10和2对模12而言互为补数。
同理,计算机的运算部件与寄存器都有一定字长的限制(假设字长为8),因此它的运算也是一种模运算。当计数器计满8位也就是256个数后会产生溢出,又从头开始计数。产生溢出的量就是计数器的模,显然,8位二进制数,它的模数为2^8=256。在计算中,两个互补的数称为“补码”。
图3中 的错误解释:由于usigned long最大取值范围为2^32-1,而%d是以有符号整数进行输出,故进行了数值转换,即转为signed int,对于signed int 取值范围最大值小于usigned long,发生溢出,根据上述对模概念的说明,应该明白为什么输出是-2了。
图3
图4、图5为用基于X64处理器的gcc编译器输出各整型数据类型长度的结果
图4
图5
-
在c语言中,输出一个整型变量用的下面哪一种格式控制符A.%cB.%dC.%f
2021-05-19 10:55:59A.%cB.%dC.%fD.%m【单选题】使用下列哪个格式控制符可设置转换十六进制为十进制( )A.decB.octC.hexD.endl【多选题】以下各项,属于printf() 函数的格式控制符的是()A.%cB.%dC.%eD.%m【单选题】实型中单... -
编程将长整型数中每一位上为偶数的书依次取出组成一个新的输
2021-05-22 06:54:35编写函数long fun(long x),将长整型参数x中每一位上为偶数的数依次取出,构成一个新数返回.#includelongfun(longx){intn=10,m=0;while(x){intt=x%10;if(t%2==0){m+=t*n/10;n*=10;}x/=10;}returnm;}voc语言编程:将一... -
1.下列字符列中,合法的长整型常量是: 【 】
2020-12-09 08:57:031.下列字符列中,合法的长整型常量是:【】(A)4.18e3(B)0.46793(C)4L(D)9567382.设变量x,y,a,b,c,d的值为1,计算表达式(x=a!=b)&&(y=c!=d)后,变量x,y的值分别是:【】(A)0,...1.下列字符列中,... -
C++中整型变量的存储大小和范围
2017-11-09 21:24:01C++中可用的整型类型有五种,由小到大分别是char(也可以看成一种单字节的整型)、short、int、long、long long。它们使用不同数目的位来存储整型值。char在任何系统中都是单字节8位,但是short总是16位,int总是32位吗... -
设置一绝对地址为0x67a9的整型变量的值为0xaa66
2013-03-02 12:15:51在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。 这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(typecast)为一指针... -
C语言基本数据类型:整型(int)用法详解
2021-05-20 07:08:441.整型intC语言提供了很多整数类型(整型),这些整型的区别在于它们的取值范围的大小,以及是否可以为负。int是整型之一,一般被称为整型。以后,在不产生歧义的情况下,我们把整数类型和int都称为整型。int代表有... -
智慧职教: 在Java语言中,一条语句可以定义多个变量。例如int a;...就定义了两个整型变量a 和b。
2021-03-09 05:13:18就定义了两个整型变量a 和b。答:0“物的依赖性关系”是( )答:资本主义社会之中的人与人之间的关系七情说是记载于我国古代名著《大学》中答:×国防动员是打赢和遏制战争、巩固国防、维护国家安全与发展的一个( )... -
C语言中各种整型变量在不同字长机器上的字节数详细探讨
2016-03-09 10:25:56今天,看到一个特别基础的问题探讨,但是认识比较深入,感觉文章比较好,转载至此 文末附上原文链接 突然间就想到了long和int到底什么区别(发现有...short与long两个限定符的引入可以为我们提供满足实际需要的不同 -
94.取出长整型各位为奇数的数组成一个新的数
2015-07-03 15:26:45函数fun的功能是:将长整型数中每一位上为奇数的数依次取出,构成一个新书放在t中,高位仍在高位,低位仍在低位。 #define _CRT_SECURE_NO_WARNINGS #include void fun(long s, long *t) { int d; long s1 = ... -
在整型变量x中存放了一个两位数,如果要将该两位数的个位数字和十位数字交换位置,例如将13变成31,以下Python...
2020-12-29 09:40:13【填空题】要关闭Python解释器,可使用____________命令或快捷键_______________。...【简答题】假设有a=10,写出下面表达式运算后a的值。 (1)a+=a (2) a-=2 (3) a*=2+3 (4) a/=2+3 (5) a%=a-a%4 (6) ... -
C语言入门 — 整型 char,short,int,long
2021-05-20 13:08:181、整型变量位数,以下基于32位的操作系统:(1个字节等于8bits)点击查看二进制长整型(long),短整形(short),整型(int),字符型(char)有符号数:用最高位代表符号位,‘0’代表正数,‘1’代表负数,其余位用作 数字... -
C++ 测量整型(int, short, long 和 long long ) 的长度
2019-02-27 08:31:50C++对整型short、int、long和long long的长度规则定义如下: - short 至少16位; - int 至少和short一样长; - long 至少32位,且至少和int一样长; - long long 至少64位,且至少和long一样长。 可能这个地方比较... -
无符号长整型llu
2019-07-18 09:50:13转载: ... (2011-05-24 00:58:17) 转载 ...虽然long double比double长4个字节,但是表示的数值范围却是一样的。 long double类型的长度、精度及表示范围与所使用的编译器、操作系统等有关。 -
C语言整型数据分析
2021-05-19 10:37:50C语言整型数据分析不同类型的量可以参与运算并相互赋值。其中的类型转换是由编译系统自动完成的。以下是小编为大家搜索整理的C语言整型数据分析,希望能给大家带来帮助!更多精彩内容请及时关注我们应届...长整型:... -
详解python的数字类型变量与其方法
2021-01-20 05:22:43前言 python数据类型是不允许改变的,这就意味着如果改变 Number 数据类型的值,将重新分配内存空间。下面话不多说,来看看详细的介绍吧。 以下实例在变量赋值时 Number 对象将被...长整型(long) – 无限大小的整数 -
c语言int的用法
2021-05-20 06:56:08C 语言提供了很多整数类型(整型),这些整型的区别在于它们的取值范围的大小,以及是否可以为负。int 是整型之一,一般被称为整型。以后,在不产生歧义的情况下,我们把整数类型和 int 都称为整型。下面我们来看看... -
实型变量允许存放整形数吗
2021-05-20 17:46:17vb中,以下变量类型1,数字型变量(numeric)2,字符串型变量(string)3,日期型变量(date)4,对象型变量(object)5,变...下面就来详细介绍这几种变量.1.数字型数字型变量有多种类型,在咱们的vb里,有3中数字数据类型1;整形... -
指针变量的存储实质,C语言指针变量的存储详解
2021-05-22 12:43:38相信大家都知道这样一个学习指针的观点:要想彻底理解 C 语言中的指针,首先一定要理解 C 语言中变量的存储实质。谈到变量的存储,我们就不得不先说说计算机的内存概念。计算机的内存是一个用于存储数据的空间,由一... -
C语言学习之通过指针变量输出整型数组a的10个元素
2021-05-05 20:59:56通过指针变量输出整型数组a的10个元素 int main(){ int a[10],i,*p=a;//p的初值是a,p指向a[0] for(i=0;i<10;i++){ scanf("%d",p++); } p=a;//重新使p指向a[0] for(i=0;i<10;i++,p++){ printf("%d ... -
字符串变量是什么意思
2021-05-19 09:17:24下面是学习啦小编整理字符串变量的内容,欢迎阅读。字符串的简介字符串主要用于编程,概念说明、函数解释、用法详述见正文,这里补充一点:字符串在存储上类似字符数组,所以它每一位的单个元素都是可以提取的,如s=... -
第三节:整型数据(整数)
2021-01-11 21:13:15C语言整型数据(整数)整型数据即整数。...长整型:类型说明符为long int或long,在内存中占4个字节。无符号型:类型说明符为unsigned。无符号型又可与上述三种类型匹配而构成:无符号基本型:类型说明符为unsigned ... -
matlab将一个数组中的元素转换为整型_科学计算 | MATLAB基础知识
2020-11-21 14:26:36话不多说,下面直接进入主题。01matlab系统环境1.matlab操作界面的组成⑴matlab主窗口包括:功能区 快速访问工具栏 当前文件夹工具栏⑵命令行窗口用于输入命令并显示命令的执行结果注意:当在命令行窗口执行命令时,... -
c语言引用数组元素时其数组下标的允许的数据类型是什么
2021-05-20 06:25:32很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在c语言中,引用数组元素时,其数组下标的数据类型允许是:整型常量或整型表达式... -
C语言期末复习卷习题
2021-05-20 08:39:51若已知x,y,z,m,n均为int 型变量,则执行下面语句后,x的值为 7 y的值为 9 z的值为 7 m=10 ; n=5; x=(--m==n++)? --m : ++n; y=m++; z=n; 10. 若有说明语句: w=1,x=2,y=3,z=4; 则表达式w>x? w:z>y? z:x值是 4 11. ...