Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
谁决定字节的大小,是编译器还是CPU? < P>我知道,字节是CPU内存最小的可寻址代码单元,所以X86-32机的字节大小是8位,而C++标准规定: siZeOf(char)=1字节>=8位< /C> >,所以我可以有一个编译器,用于x8632机器,它有 siZeof(char)=16位< /代码>,这意味着字节是16位。_C++_C_Byte - Fatal编程技术网

谁决定字节的大小,是编译器还是CPU? < P>我知道,字节是CPU内存最小的可寻址代码单元,所以X86-32机的字节大小是8位,而C++标准规定: siZeOf(char)=1字节>=8位< /C> >,所以我可以有一个编译器,用于x8632机器,它有 siZeof(char)=16位< /代码>,这意味着字节是16位。

谁决定字节的大小,是编译器还是CPU? < P>我知道,字节是CPU内存最小的可寻址代码单元,所以X86-32机的字节大小是8位,而C++标准规定: siZeOf(char)=1字节>=8位< /C> >,所以我可以有一个编译器,用于x8632机器,它有 siZeof(char)=16位< /代码>,这意味着字节是16位。,c++,c,byte,C++,C,Byte,在这个例子中,字节是CPU的8位,从编译器的角度来看是16位。那么字节的定义是什么,它的大小由什么决定?编译器决定。然而,在C和C++的情况下,编译器通常会因为性能的原因而跟随CPU。 在最小可寻址单元为16位宽的平台上,编译器可以实现8位char,但它必须(1)发出指令以从16位“字节”中取出8位单元,(2)每个char*或void*都需要额外的位来指示下半部分/上半部分 反之亦然,您可以在x86上实现具有16位char的编译器,但这意味着所有C字符串占用的内存将是它们通常占用的两倍,并且很难

在这个例子中,字节是CPU的8位,从编译器的角度来看是16位。那么字节的定义是什么,它的大小由什么决定?

编译器决定。然而,在C和C++的情况下,编译器通常会因为性能的原因而跟随CPU。 在最小可寻址单元为16位宽的平台上,编译器可以实现8位
char
,但它必须(1)发出指令以从16位“字节”中取出8位单元,(2)每个
char*
void*
都需要额外的位来指示下半部分/上半部分


反之亦然,您可以在x86上实现具有16位
char
的编译器,但这意味着所有C字符串占用的内存将是它们通常占用的两倍,并且很难与外部世界进行接口,即8位
char

在C中,一个字节具有
char\u位
位(
CHAR\u BITS
中定义)。该值取决于实现(具有不同选项的同一编译器可能具有不同的值)即使在A,<代码> CARIOSITS 必须至少8是C兼容的。在最小可寻址单元为36位的平台上,字节实际上是9位,而最小可寻址单元是48位,字节是8位。(我不知道后者的C++编译器,但它确实有,或者至少有一个C编译器。)@但是在这样的平台上,C编译器将不得不使用一种技巧使较小的单元可寻址,即使用内存地址+偏移量来生成
char*
。(此外,36位PDP-10的IIRC具有6位字符,而不是9位。但ISO C不接受这种情况。)而且……这也是标准不要求
char*
int*
具有相同大小的原因。(在大多数情况下,硬件确实有一组有限的指令用于读取和写入单个“字节”,因此这些指令中会用到一些技巧。(例如,PDP-10请参阅。)@larsmans如果是编译器决定字节的大小,那么这难道不意味着在硬件环境中没有字节吗?@larsmans在
x86-32
机器上,如果我使用一个编译器将char实现为
10位
,char对象将如何分配,它们需要mem的
16位
ory(
10位
+
6位
填充),或者它只会占用内存中的
10位