【C++菜鸟问题】32/64为数据类型长度+sizeof

6 篇文章 0 订阅
5 篇文章 0 订阅

一、C

1.几条规则

(1)char类型一般是8bit,但ANSI C里没有硬性规定其长度,某些嵌入式编译器可能是16bit

(2)short和long类型的长度不相同

(3)int类型通常同具体机器的物理字长相同

(4)short通常是16bits, int通常是16bits or 32bits每种编译器可以根据硬件的不同自由确定,但是short和int必须最少是16bits, 而long类型必须最少是32bits,并且short必须比int和long类型要短。

2.32位机上类型长度

size of char: 1

size of int: 4

size of long:4

size of float:4

size of long long:8

size of double:8

size of long double:12

size of char * :4

3.64位机上类型长度

size of char:1

size of int:4

size of long :8

size of float :4

size of long long:8

size of double:8

size of long double:16

size of char * :8

4.16位机类型长度

char: 1

int: 2

long:4

unsigned int:2

unsigned short:2

unsigned long:4

float:4

size of char * :4

二、C++

1.字节和字长

字节,八位就是一个字节,是固定概念。字长是指计算机一次能处理的二进制数据的长度,是一个非固定的概念。例如,8位计算机的字长为8,即一个字节,32位计算机的字长位32,即4个字节,同理,64位计算机的字长为64,即8字节。

2.char类型始终是一个字节长,即8位。

3.int、short int和long int

通常int为一个字长,short为半个字长,long为一个或2个字长(在32位机器中为一个字长)。

4.浮点型float、双精度double、和长双精度long double

典型情况下,float 为一个字,double是两个字,long double为三个或四个字。
#include <iostream>
using namespace std;

int main()
{
	cout << "Size of char : " << sizeof(char) << endl;
	cout << "Size of int : " << sizeof(int) << endl;
	cout << "Size of short int : " << sizeof(short int) << endl;
	cout << "Size of long int : " << sizeof(long int) << endl;
	cout << "Size of float : " << sizeof(float) << endl;
	cout << "Size of double : " << sizeof(double) << endl;
	cout << "Size of wchar_t : " << sizeof(wchar_t) << endl;
	return 0;
}
Size of char : 1
Size of int : 4
Size of short int : 2
Size of long int : 4
Size of float : 4
Size of double : 8
Size of wchar_t : 2

#include<stdio.h>

void f(char *p)
{
	char b[10];
	printf("%d %d\n", sizeof(p), sizeof(b));
}
int main()
{
	char a[10];
	f(a);
	return 0;
}
4 10

指针变量的sizeof

学过数据结构的你应该知道 指针是一个很重要的概念,它记录了另一个对象的地址。既然是来存放地址的,那么它当然等于计算机内部 地址总线的宽度。所以在32位计算机中,一个 指针变量的返回值必定是4(注意结果是以 字节为单位),但是,在 64位系统中指针变量的sizeof结果为8。
char*pc="abc";
int*pi;
string*ps;
char**ppc=&pc;
void(*pf)();//函数指针
sizeof(pc);//结果为4
sizeof(pi);//结果为4
sizeof(ps);//结果为4
sizeof(ppc);//结果为4
sizeof(pf);//结果为4
数组的sizeof
数组的sizeof值等于数组所占用的内存字节数,如:
char a1[] = "abc"; int a2[3]; sizeof( a1 ); // 结果为4,字符末尾还存在一个NULL终止符 sizeof( a2 ); // 结果为3*4=12(依赖于int)
一些朋友刚开始时把sizeof当作了求 数组元素的个数,如今你应该知道这是不对的,那么应该怎么求数组元素的个数呢Easy,通常有下面两种写法:
1
2
intc1= sizeof (a1)/ sizeof ( char ); //总长度/单个元素的长度  char型
intc2= sizeof (a2)/ sizeof (a2[0]); //总长度/第一个元素的长度 int型
写到这里,提一问,下面的c3,c4值应该是多少呢
1
2
3
4
5
6
7
8
voidfoo3(chara3[3])
{
intc3= sizeof (a3); //c3==
}
voidfoo4(chara4[])
{
intc4= sizeof (a4); //c4==
}

也许当你试图回答c4的值时已经意识到c3答错了,是的,c3!=3。这里函数参数a3已不再是 数组类型,而是蜕变成 指针,相当于char* a3,为什么仔细想想就不难明白,我们调用函数foo3时,程序会在栈上分配一个大小为3的数组吗不会!数组是“传址”的,调用者只需将 实参的地址传递过去,所以a3自然为指针类型(char*),c3的值也就为4。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值