数据类型的大小和大小(数据类型)之间的区别
The difference between size of datatype and sizeof(data type)
我正在学习C++,遇到了以下问题。我只是一个初学者,我很困惑。sizeof(( 函数不应该返回数据类型的大小吗?为什么数据对象的大小可能与其 sizeof(( 不同?我不明白答案的解释。
假设在一台假设的机器中,char 的大小为 32 位。大小(字符(会返回什么?
a( 4
b( 1
c( 依赖于实施
d( 取决于机器
答案:b
说明:该标准不要求字符为 8 位,但确实要求 sizeof(char( 返回 1。
sizeof
运算符生成类型的大小(以字节为单位(,其中字节定义为char
的大小。因此,根据定义,sizeof(char)
始终为 1,无论char
在给定平台上有多少位。
这适用于 C 和 C++。
从C11标准,6.5.3.4
sizeof
运算符生成其操作数的大小(以字节为单位(,该操作数可以是表达式或类型的括号名称。大小由操作数的类型确定。
然后
- 当
sizeof
应用于类型为char
、unsigned char
或signed char
的操作数(或其限定版本(时,结果为 1。
从 C++11 标准 5.3.3
sizeof
运算符在其操作数的对象表示形式中生成字节数。操作数要么是一个表达式,它是一个未计算的操作数(条款 5(,要么是一个带括号的 type-id。sizeof(char)
、sizeof(signed char)
和sizeof(unsigned char)
为1。
(强调我的(
你只是对字节和八位字节之间的区别感到困惑。
字节是一个字符的大小。这会产生始终为真sizeof(char) == 1
,因为sizeof
返回以字节为单位的大小
而八位字节由 8 位组成。
在几乎所有现代平台上,字节的大小恰好与八位字节的大小相同。这就是为什么将它们混为一谈是一个常见的错误,甚至书籍作者和教授也在这样做。
per 5.3.3 [expr.sizeof]
sizeof 运算符在其操作数的对象表示形式中生成字节数。操作数要么是表达式(它是未计算的操作数(子句 5(,要么是带括号的类型 ID。sizeof 运算符不得应用于具有函数或不完全类型的表达式,也不得应用于枚举 其基础类型在声明其所有枚举器之前未固定的类型,类型为此类类型的括号名称,或指定位字段的 glvalue 的类型。sizeof(char(、sizeof(signed char( 和 sizeof(unsigned char( 为 1。[...]
强调我的
因此,无论char
占用多少位,其大小始终为1
sizeof(x)
返回以 char
大小单位表示的x
的大小。
没有 sizeof(char( 为 4 的机器。它始终为 1 个字节。该字节可能包含 32 位,但就 C 编译器而言,它是一个字节。
"8 位"的正确名称是八位组。C 标准使用单词"byte"来表示字符大小的对象。其他人可能以不同的方式使用"字节"一词,通常是当他们表示"八位字节"时,但在C(和C++,或Objective-C(中,它的意思是"字符大小的对象"。字符可能超过 8 位,也可能超过一个八位字节,但它始终是一个字节。
问题应该是——假设在一台假设的机器中,word size(size of registers)
是 32 位。大小(字符(会返回什么?
答案将是1 byte
.
在计算中,单词是数据的自然单位的术语,用于表示 特定的处理器设计。单词是固定大小的数据片段 由指令集或硬件作为一个单元处理 处理器。单词中的位数(字大小、字宽或 字长(是任何特定处理器的重要特征 设计或计算机体系结构。-- https://en.wikipedia.org/wiki/Word_%28computer_architecture%29
在您的情况下word-size
将是 32 位。也
从历史上看,字节是用于编码单个字节的位数 计算机中文本的字符,因此它是最小的 许多计算机体系结构中的可寻址内存单元。-- https://en.wikipedia.org/wiki/Byte
1 字节是最小的可寻址内存单元,它是硬件规格选择的 8 位、9 位或 16 位。
就sizeof
而言,它首先确定参数的类型,最终计算以字节为单位的大小。因此,以下两个C++语句将产生相同的结果。
int n;
std::cout<<sizeof(int);
std::cout<<sizeof(n);
- 防止主数据类型C++的隐式转换
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在C++中打印指向不同基元数据类型的指针的内存地址
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- C++ - 比较模板和类之间的数据类型
- 包括数据类型之间的斗争
- C++11 标准中的哪一部分规定了基元数据类型大小之间的相对顺序?
- memcpy是否可以保留不同类型之间的数据
- 创建一个带有限制的数字数据类型,一个介于 -10 和 10 之间的整数
- 抽象数据类型(ADT)和数据结构之间有什么区别
- 数据类型类和读取器/解析器之间的耦合
- 数据类型之后或变量名称之前的引用符号之间的差异
- gSoap在接口之间共享数据类型
- 我们应该使用哪种数据类型来输入一个介于 0<= 数字 <= 10^18 之间的数字
- 可以在 C# 和C++之间传输的数据类型
- 在10^10到10^11之间的数字的数据类型应该是什么
- 数据类型的大小和大小(数据类型)之间的区别
- 在托管c#应用程序的非托管c++ Dll调用中,如何处理数据类型之间的冲突
- 在 32 位到 64 位之间更改数据类型