在c语言中,int,char,short三种类型数据在内存中所占的字节数由啥决定
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在c语言中,int,char,short三种类型数据在内存中所占的字节数由啥决定相关的知识,希望对你有一定的参考价值。
通常char占1个字节,short占2个字节。原因是,1个字节可以表示一个ASCII码,为了提高计算机的数据处理能力,short用一个字节远远不足,但限于早年的存储器体积和价格,用2个字节也是不得以的事情。现在,存储器的体积不再是考虑的因素,价格也不是“事”,CPU的数据寄存器已经是64位(8个字节),32位的CPU已近末日黄昏,所以short用8个字节表示不再是梦。所谓64位的CPU,指的就是其数据寄存器(包括指令寄存器)的宽度是64bits,一次读取、存储64bits最为快捷,这就是int类型数据的标准宽度。 参考技术A 总结一下哈:针对大部分32位机器来说所占内存是: char 字符型 1个;int整型2 个;short 2 个;但是,不同的机器,和不同的编译软件下,都会不同。所以你可以用sizeof()函数测试一下。例sizeof(char);这里补充下我的答案,之前回答这个问题时候,自己还是一名单片机开发爱好者,C51单片机中的int确实是16位,两个字节。
而现在的我从事应用软件开发,在这些编译器中(比如vs、gcc),int一般都是4位的(无论32位还是64位)。事实上,一个比较官方的解释是:编译器可以根据自身硬件来选择合适的大小,但是需要满足约束:short和int型至少为16位,long型至少为32位,并且short型长度不能超过int型,而int型不能超过long型。这即是说各个类型的变量长度是由编译器来决定的。 参考技术B 字符型 char 1 字节
整型 int 2 字节
short 2 字节
长整型 long 4 字节
单精度 float 4 字节
双精度 double 8 字节 参考技术C 一般来说
int 4字节
char 1字节
short 2字节
由编译器决定的,编译器会根据系统平台自己改变数据类型的取值范围。 参考技术D 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个字节
32位编译器
char :1个字节
char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 4个字节
long long: 8个字节
unsigned long: 4个字节
64位编译器
char :1个字节
char*(即指针变量): 8个字节
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 8个字节
long long: 8个字节
unsigned long: 8个字节
C语言--数据类型--取值范围
C 语言基本数据类型:字符型(char)整形(short, int, long)浮点型(float, double)
注:如下类型字节数指一般情况,不同的平台会有所不同,具体平台可以用sizeof 关键字测试一下.
|
|||
类型 | 字节数 | 类型 | 字节数 |
char | 1 | short | 2 |
int | 2(16位系统)或4(32位系统) | long | 4 |
float | 4 | double | 8 |
类型 | 范围 | 类型 | 范围 |
(signed)char | -128~~127 | unsigned char | 0~~255 |
(signed)short | -32768~~32767 | unsigned short | 0~~65535 |
(signed)int | -32768~~32767 | unsigned int | 0~~65535 |
(signed)long |
-2147483648~~2147483647 |
unsigned long |
0~~4294967295 |
float |
-3.4*10-38 ~~ 3.4*1038 |
double |
-1.7*10-308 ~~ 1.7*10308 |
1. 运算会导致字符型/整型溢出其取值范围
eg.
int main()
{
signed char ch = 127;
ch += 1;
printf("%d\\n", ch);
return 0;
}
输出结果为:-128,注意,定义ch时赋予的值为127,已经是char能表示的最大数,其最终结果-128的来历是这样的:
第一步:首先127在计算机中用二进制表示为:01111111;
第二步:01111111 + 00000001 = 10000000;
第三步:由于ch是带符号的,当最高位为1时,表示是负数,而负数的计算机中是利用补码来存储的,回忆计算负数补码的方法(首先取负数的绝对值,然后求二进制,对二进制取反,在对取反后的值加1,即为负数的补码);
第四步:于是根据求补码的反步骤,我们来求最原始的负数,由于本题中补码为10000000,首先10000000 - 00000001 = 01111111,然后对01111111取反为10000000,10000000 = 128,由于本身是负数,即ch为-128.
eg.
int main()
{
unsigned char ch = 255;
ch += 1;
printf("%d\\n", ch);
return 0;
}
输出结果为:0;
其分析为:首先ch = 255提升为整形,在计算机的存储为:(000....)11111111,然后(000....)11111111+1 = (000...)0001 00000000;然后再将最后的八位二进制截取给ch,由于最后八位全是0,因此ch = 0了。
同理:对于遇到整形int short, long等出现上述情况时,我们也可以这样分析得到结果.
2.用预处理指令#define 声明一个常数,用以表明1年中有多少秒?
#define SECOND_PER_YEAR (60*60*24*365)UL
①#define语法的基本常识(例如:不能以分号结束,括号的使用等等)
所有宏定义、枚举常数、只读变量全用大写字母命名,用下划线分割单词.
const int MAX_LENGTH = 100; //这不是常量,而是一个只读变量,具体请往后看
#define FILE_PATH “/usr/tmp”
②写出你是如何计算一年中有多少秒而不是计算实际的值,会更有价值
③意识到这个表达式将使一个int数溢出,因此最好用的长整形,那么你就会为自己加分了
以上是关于在c语言中,int,char,short三种类型数据在内存中所占的字节数由啥决定的主要内容,如果未能解决你的问题,请参考以下文章