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的值。


猜你喜欢

转载自blog.csdn.net/weixin_40389330/article/details/80950374