我正在寻找有关基本C++类型大小的详细信息.我知道这取决于架构(16位,32位,64位)和编译器.
但是有没有C++的标准?
我在32位架构上使用Visual Studio 2008.这是我得到的:
char : 1 byte
short : 2 bytes
int : 4 bytes
long : 4 bytes
float : 4 bytes
double: 8 bytes
Run Code Online (Sandbox Code Playgroud)
我试图找到,但没有成功,可靠的信息,表述的大小char,short,int,long,double,float(和其他类型的我没想到的),在不同的体系结构和编译器.
我知道C和C++标准留下了语言实现的许多方面 - 仅仅因为如果存在具有其他特征的体系结构,那么为它编写符合标准的编译器是非常困难或不可能的.
我知道40年前任何电脑都有自己独特的规格.但是,我不知道今天使用的任何架构:
CHAR_BIT != 8signed 不是两个补充(我听说Java有这个问题).我问的原因是我经常向人们解释C++不强制要求任何其他低级方面如固定大小的类型†.这很好,因为与其他语言不同,它使你的代码在正确使用时可以移植(编辑:因为它可以移植到更多架构而不需要模拟机器的低级方面,例如符号+幅度架构上的二进制补码算法) .但我感到很难过,我自己也无法指出任何特定的架构.
所以问题是:哪些架构具有上述属性?
† uint*_ts是可选的.
有机器(或编译器),在哪里sizeof(char) != 1?
C99标准是否说sizeof(char)标准合规性实施必须正好1?如果有,请给我部分编号和引文.
更新:
如果我有一台机器(CPU),它不能寻址字节(最小读取是4个字节,对齐),但只有4-s的字节(uint32_t),这个机器的编译器可以定义 sizeof(char)为4吗?sizeof(char)将是1,但char将有32位(CHAR_BIT宏)
Update2: 但是sizeof结果不是BYTES!这是CHAR的大小.char可以是2个字节,或者(可能是)7位?
Update3:
好的.所有机器都有sizeof(char) == 1.但机器有CHAR_BIT > 8什么?
我做了一些研究.一个字节是8位,一个字是可以在内存中寻址的最小单元.单词的确切长度会有所不同.我不明白的是有一个字节是什么意思?为什么不说8位?
我问过这个问题的教授,他说这些天大多数机器都是字节可寻址的,但这会产生什么结果呢?
我一直在读句子
不要依赖大小为8位的1字节
使用
CHAR_BIT而不是8作为常量来转换位和字节
等等.今天有什么现实生活系统,这是真的吗? (我不确定C和C++之间是否存在差异,或者它是否与语言无关.如果需要,请重新加入.)
我们有8位,16位,32位和64位硬件架构和操作系统.但不是说42位或69位.
为什么?它是否能使2 ^ n位成为更好的选择,或仅仅是与现有系统的兼容性?(64位寄存器可以容纳两个32位指针,或者一个32位数据单元可以容纳4个字节,这显然很方便.)
我一直认为:
char由一个字节表示,sizeof (char)总是1,chars 计)是RAM的字节数(+交换空间).但是现在我已经阅读了维基百科条目,我不再那么肯定了.
我的假设中有哪一个是错的?哪一个是危险的?
假设程序在具有UTF-16编码字符集的系统上运行.所以根据C++编程语言 - 第4页,第150页:
char可以保存机器字符集的字符.
→我认为char变量的大小是2字节.
但根据ISO/IEC 14882:2014:
sizeof(char),sizeof(signed char)并且sizeof(unsigned char)是1".
或者C++编程语言 - 第4页,第149页:
"[...],所以根据定义,char的大小是1"
→固定尺寸为1.
问题:上述这些语句之间是否存在冲突,或者sizeof(char) = 1只是默认(定义)值,并且实现定义取决于每个系统?
是否有标准投诉方法来表示ANSI(C89/90)C中的字节?我知道,大多数情况下,一个字符恰好是一个字节,但我的理解是,这不能保证是这种情况.另外,在C99标准中有stdint.h,但在C99之前使用了什么?
我特别想知道8位和"字节"(sizeof(x)== 1).