C语言中数据类型所占字节数与它取值范围的关系

作者&投稿:圭晴 (若有异议请与网页底部的电邮联系)
C语言数据类型占的字节和取值范围问题~

第1:电脑64位,和你的程序64位是两个概念。
第2:ANSI C 没有long double 这种写法,长度取决于编译器。你应该用的是VS把,这个所以谈long double 长度没有意义。

PS.关于长度的规范 可以搜索 ILP32 LP64 LLP64 ILP64,WIN和UNIX不太一样

在C语言中,变量类型所占位数和具体的编译环境有关。比如短整形,有的编译环境占四个字节,有的占两个字节;而char类型都是占一个字节。取值的话,就是2的几次方了,和所占字节有关。忘了很多,希望能帮助你。

C语言中的数据类型,简单的可以分为整数类型和浮点数类型。所占字节数与取值范围的关系实际上是整数编码和浮点数编码的问题,整数编码的三种方式是原码、反码、补码,很容易理解,浮点数的编码格式使用的是IEEE754编码。


1、整数编码以字符类型为例。

字符类型占1个字节,共8位二进制bit位,因此排列组合数,有2^8 = 256种编码的方法。如果表示无符号字符类型,那一般来说表示【0,255】这256个数。


如果表示有符号char类型,如果表示正数,那最高位符号为0,因此可表示的最正整数是:

0-111 1111 ,转化成十进制就是127。同样的道理,符号为1表示负数。最小的负数是

1-000 0000,转化成十进制数就是-128,因此有符号char类型表示的范围是[-128,127]。


一般来说,假设整型数据类型占的二进制位数n,如果表示无符号整数则取值范围是[0,2^n-1],如果表示有符号整数,【-2^(n-1) , 2^(n-1) - 1] 。


2、浮点数类型

浮点数编码一般采用的是IEEE754的编码规则,这个编码格式主要指出了浮点数有效数字、指数以及符号位所占的二进制位数。简单概括为:


格式       长度  符号位 指数位  尾数位  有效位数  指数偏移   尾数说明

单精度     32     1       8       23      24        127       有一位隐含位

双精度     64     1      11       52      53       1023       有一位隐含位

扩展双精度 80     1      15       64      64      16383       没有隐含位

注意:扩展双精度格式没有隐含位,因此它的有效位数与尾数位数一致,而单精度和双精度格式均有一位隐含位,因此它们的有效位数比尾数位数多1。


一般很少自己手动来算浮点数的取值范围,可以使用如下程序来计算。

#include <stdio.h>
typedef struct FP_SINGLE
{
unsigned __int32 fraction : 23;
unsigned __int32 exp      : 8;
unsigned __int32 sign     : 1;
} fp_single;
typedef struct FP_DOUBLE
{
unsigned __int64 fraction : 52;
unsigned __int64 exp      : 11;
unsigned __int64 sign     : 1;
} fp_double;
typedef struct FP_EX_DOUBLE
{
unsigned __int64 fraction;
unsigned __int32 exp  : 15;
unsigned __int32 sign : 1;
} fp_ex_double;
int main()
{
float x;
fp_single * fp_s = (fp_single *)&x;
fp_s->sign = 0;
fp_s->exp = 0xfe;
fp_s->fraction = 0x7fffff;
printf ("float 最大数:      %le
",(double)x);
fp_s->sign = 0;
fp_s->exp = 0x1;
fp_s->fraction = 0x0;
printf ("float 最小数:      %le
",(double)x);
fp_s->sign = 0;
fp_s->exp = 0;
fp_s->fraction = 0x1;
printf ("float 最小弱规范数:%le

",(double)x);
double y;
fp_double * fp_d = (fp_double *)&y;
fp_d->sign = 0;
fp_d->exp = 0x7fe;
fp_d->fraction = 0xfffffffffffff;
printf ("double 最大数:      %le
", y);
fp_d->sign = 0;
fp_d->exp = 0x1;
fp_d->fraction = 0x0;
printf ("double 最小数:      %le
", y);
fp_d->sign = 0;
fp_d->exp = 0;
fp_d->fraction = 0x1;
printf ("double 最小弱规范数:%le

", y);
char ch[10];
fp_ex_double * fp_ex_d = (fp_ex_double *)ch;
fp_ex_d->sign = 0;
fp_ex_d->exp = 0x7ffe;
fp_ex_d->fraction = 0xffffffffffffffff;  
// 不知道扩展双精度浮点数如何输出,
// 不过可以用od跟踪,然后找到ch[0]的地址,在数据窗口中选择 浮点 80为长双精度,
// 就可以看到数值了。
fp_ex_d->sign = 0;
fp_ex_d->exp = 0x1;
fp_ex_d->fraction = 0x8000000000000000;      
fp_ex_d->sign = 0;
fp_ex_d->exp = 0;
fp_ex_d->fraction = 0x1;      
return 0;
}



对于一个两个字节的整数,它在内存中占的空间是16位,可以表示2^16=65536种不同的值,如果我们不考虑符号的话,只把他们当成二进制的数,那么恰为0~65535间的所有整数。而我们还要表示负数,一般用补码完成一个0~65535间的非负整数到一个有符号整数的映射的,说白了就是同余,比如-1=65535(mod 65536),所以65535的二进制表示1111111111111111就表示-1。用补码是很方便的,因为同余的关系嘛,加减乘除都不需要转化,直接计算就可以了。还有一些不太方便的编码,比如原码,反码,参见相关书籍。
顺便说一下,现在好多编译器里的int都是32位的,即int和long int是一样的。

每个字节8位,2个字节16位
若是有符号的int,那么除去一个符号位,还有15位,
所以取值范围是
非负数:2^15-1 到 0
负数:-1 到 - 2^15
所以int的取值范围是 -32768到32767

如果是无符号的int,那么取值范围是2^16-1 到0
就是 0到65535

补充一点,在32位环境中(如VC),int占4个字节,另外,计算机表示整型数据是补码表示.你把补码弄明白了这个问题就不难搞明白了。

int 占2个字节,16伪
2的16次方


...long类型、float类型、double类型和char类型数据,在16位和32位计算 ...
单精度 float 4个字节 有效数字7位 双精度 double 8个字节 有效数字16位 字符型 char 1个字节 以上是在16位计算机系统中,32位的加倍。如果实在不相信,可以用sizeof函数验证一下,方法如下 include“stdio.h”main(){ int m;m=sizeof(数据类型);printf(“%d",m);} ...

C语言中,数据的存储类型有哪五种?
5种基本数据类型的存储空间长度的排列顺序为 :A)char<int<long int<=float<double。char:char类型是一个单一的1 字节,数值范围-128 到 127 或 0 到 255,char 数据类型可以储存任何字符,对应的包装类:Character。int:2 或 4 字节、有符号的以二进制补码表示的整数,,min : -2,147,48...

C语言常见数据类型有哪些?英文方式如何表示?并分别说出它们所占的内存...
字符型 char 1 字节 整型 int 2 字节 长整型 long 4 字节 单精度 float 4 字节 双精度 double 8 字节 这是在TURBO C 里面的 在VC++里为了方便都是4个字节 也就是一个字长 还有 结构体struct、联合体union 内存由结构体中数据决定。

char类型的数据占几个字节?
char用于C或C++中定义字符型变量,只占一个字节,取值范围为-128~+127(-2^7~2^7-1)。C语言中如int、long、short等不指定signed或unsigned时都默认为signed,但char在标准中不指定为signed或unsigned,编译器可以编译为带符号的,也可以编译为不带符号的。MYSQL中的char数据类型 在MYSQL中,字段类型...

在c语言中,int,char和short三种类型数据在内存中所占的字节数
总结一下哈:针对大部分32位机器来说所占内存是: char 字符型 1个;int整型2 个;short 2 个;但是,不同的机器,和不同的编译软件下,都会不同。所以你可以用sizeof()函数测试一下。例sizeof(char);这里补充下我的答案,之前回答这个问题时候,自己还是一名单片机开发爱好者,C51单片机中的...

C语言编程时,整型,实型字符型所占内存的大小各为多少?数字在不同型之间...
首先不同编译器对数据类型规定在内存中所占大小是不一样的,一般,比如在vc6.0里,短整型2字节,int型4字节,long型4字节,char型1字节,数字在类型中间转化时,比如int到double只是让int型指向double型的低8位

选择.设C语言中,int类型数据占2个字节,则short类型数据占几个字节
short是占两个字节。short在C语言中是定义一种整型变量家族的一种,shorti;表示定义一个短整型的变量i。依据程序编译器的不同short定义的字节数不同。标准定义short短整型变量不得低于16位,即两个字节。编译器头文件夹里面的limits.h定义了short能表示的大小:SHRT_MIN~SHRT_MAX。在32位平台下如...

c语言基本数据类型中字符型为何占一个字节,整形占两个字节,单精度和双...
字符主要是考虑ASCII码中字符,ASCII码有8位,最高位不用,最多有128个,而且有一些不可见的字符,所以一个字节足够。至于整型以及不同精度类型的数据,考虑到在编程中使用的数据的范围,根据数据可能的范围选择不同的类型能有效提高程序的效率。处理器处理双精度数据是很费时的 ...

7、在C语言中(以16位PC机为例),5种基本数据类型的存储空间长度的排列...
5种基本数据类型的存储空间长度的排列顺序为:char<int<long int<=float<double。char(字符型)的存储空间大小为1个字节,int(整数型)的存储空间大小为2个字节,long int(长整数型)的存储空间大小为4个字节,float(单精度型)的存储空间大小为4个字节,double(双精度型)的存储空间大小为8个...

C语言中的char和int是什么关系?
所用内存大小:char类型所占用的内存大小是1个字节,int类型所占用的内存大小是4个字节。需要注意的是,C语言的标准并没有规定char类型具体的大小和取值范围,这些通常由编译器实现决定。但是,char类型通常被设计为一个8位的数据类型,用于存储ASCII码字符,而int类型通常被设计为一个32位的数据类型,...

小河区17173917396: 关于C语言数据类型取值范围? -
禹灵甘瑞: 32位平台: 分为有符号型与无符号型. 有符号型: short 在内存中占两个字节,范围为-2^15~(2^15-1) int 在内存中占四个字节,范围为-2^31~(2^31-1) long在内存中占四个字节,范围为-2^31~2^31-1 无符号型:最高位不表示符号位 unsigned ...

小河区17173917396: C语言输入数据类型名,输出所占字节... -
禹灵甘瑞: #include int main() { char str[10]; gets(str); if (!strcmp(str,"int")) printf("%d\n",sizeof(int)); else if (!strcmp(str,"char")) printf("%d\n",sizeof(char)); else if (!strcmp(str,"float")) printf("%d\n",sizeof(float)); else if (!strcmp(str,"double")) ...

小河区17173917396: C语言中怎么计算一个类型的取值范围?如 char 用程序算 -
禹灵甘瑞: C语言中char类型占一个字节,属于有符号数,按补码进行数据存放. 如果用程序,来获取取值范围,可以设置两个变量来存储最大值和最小值,另设一个unsigned char型变量,从一个字节的0(00000000)开始累加,直到变成255(11111111),...

小河区17173917396: c语言中各种数据类型所占的字节数? -
禹灵甘瑞: int 2 long 4 float 4 double 8 char 1

小河区17173917396: C语言中如何计算数据类型所占的字节?C语言中如何计算数据类型所占
禹灵甘瑞: sizeof(data), 注意字节对齐的问题

小河区17173917396: C语言中int short long 的具体区别是什么? -
禹灵甘瑞: 三种类型,在类型定义、占用字节数、数据范围等方面存在不同点. 1、定义不同 int类型称为整型; short类型称为短整型; long类型称为长整型; 2、占用字节数不同 short int型变量两个字节(两个字节); int类型四个字节(32位机中); ...

小河区17173917396: C语言 四种基本数据类型 -
禹灵甘瑞: C语言有四种基本数据类型:整型,浮点型,指针,聚合类型(数组和结构体). 1、整型家族有九种数据类型:字符型(char), 有符号字符型(signed char),无符号字符型 (unsigned char),短整型( short) ,无符号短整型( unsigned...

小河区17173917396: c语言整型数据int占几个字节 -
禹灵甘瑞: 1、16位编译器 char :1个字节 char*(即指针变量): 2个字节 short int : 2个字节 int: 2个字节unsigned int : 2个字节float: 4个字节double: 8个字节long: 4个字节long long: 8个字节unsigned long: 4个字节 2、32位编译器 char :1个字节char*: 4个字节 ...

小河区17173917396: 在C语言中,int类型,long类型,float类型,double类型和char类型在16位和32位计算机中各占几个字节? -
禹灵甘瑞: int 在内存中占4个字节,long在内存中占4个字节,float:占4个字节,double: 占8个字节,char:占1个字节,操作方法如下: 1、C#支持8中预定的整数类型.分别是sbyte、short、int、long、byte、ushort、uint、ulong.byte0-255标准的8位...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网