C语言内部数据类型
在c语言内部数据类型定义是非常重要的,数据是程序的基础,然而在c语言的底层中与计算机底层相联系的,各种基本数据类型在内存中的表示形式,以及类型转换的初步知识;结构体、数组的内存布局。基本数据类型定义在c语言程序 设计基础已经学习过。这里要研究的是在计算机系统底层的数据类型。
1、测试各个数据类型的长度:
#include<stdiio.h>
int main()
{
printf(“bool :%d\n,sizeof(bool));
printf(“char :%d\n,sizeof(char));
printf(“short :%d\n,sizeof(short));
printf(“int :%d\n,sizeof(int));
printf(“long :%d\n,sizeof(long));
printf(“float :%d\n,sizeof(float));
printf(“double :%d\n,sizeof(double));
}
结果:(在gcc下编译时实现)
由实验结果可以得知int类型通常同具体机器物理字长相同,而short通常是16bits或者32bits,但是short和int必须最少是16bits,而long类型必须最少是32bits,并且short必须比int 和long类型要短,在32位的操作系统上各个数据类型的内存大小就如截图所示,但是在64位操作系统上long和unsigned long 是8个字节。
2、利用c++检测计算机是大端还是小端:
#include<iostream>
using namespace std;
void main(void)
{
short s;
char c1,c2;
s=16706;
c1=*((char*)&s);
c2=*(((char*)&s)+1);
cout<<c1<<end1;
cout<<c2<<end2;
}
数据有高位和低位之分,地址也有高地址和低地址之分,大小端的问题就是查看数据在内存中是如何存放的,低位的数据是在低地址还是在高地址出存放的,无论用什么方法,其判断的根本思想都是一样的。首先将变量S的值赋值为16706,该值的16进制的表示为0x4142,由于42位是高字节,41位是低字节,通过指针分别将这两个字节取出后赋给字符变量,然后取出变量S的地址并转化为指向char型的指针,之后再用*取出变量S的首地址,由此说明该机器是小端机。
3、结构体数据类型
#include<iostream>
using namespace std;
struct number
{
int real;
int ima;
};
int
main()
{
number num;
num.real=36;
num.ima=72;
cout<<num.real<<'+'<<num.ima<<'i'<<endl;
((number*)&num.ima)->real=10;
cout<<num.real<<'+'<<num.ima<<'i'<<endl;return 0;
}
测试代码第一次输出为最初的赋值,没有问题。第二次因为使用了代码((number*)&num.ima)->real=10;将输出改变了。为什么呢?因为&num.ima表示取出结构体中的变量ima的地址,而使用(number *)表示把从该地址开始的连续的8字节数的空间当成是一个number结构体的整体,之后的->real表示指向新结构体的第一个变量,而由于栈的存储方式以及开始取出的地址,可以知道此时指向的变量即是原结构体中变量ima,因此将赋值为10后,即使改变了变量ima的值。