为什么使用“int”(而不是“char”)来表示位?

问题描述 投票:0回答:1

我正在考虑学习一些位操作。
我知道计算机中的内存是按字节寻址的。 [1 字节 = 8 位]
我知道标准是使用

int
[4 bytes] 并“旋转”其中的位。

但为什么不是“

char
”或“
u_int8_t
”呢?
这些更接近一个字节大小(更模块化); 并且具有与 int 类似的操作。 (虽然,我猜
chars
被编译器类型转换为
ints
,堆积了额外的操作)。

此外,如果不是这些,那么我们可以在 64 位处理器上使用 '

long
' 数据类型吗? (我的直觉说这是可能的,但不能移植到 x86)。

TL;DR - 使用“

int
”作为位数据存储的基本原理是什么(在算法设计意义上).

点击这里这里。 相关 - 链接

c++ c integer bit
1个回答
1
投票

使用“int”作为位数据存储背后的基本原理是什么

很久以前,

int
代表处理器的“字”。假设
int
是处理器能够最快运行的数据类型。这就是为什么在任何计算中
char
都会被提升为
int
,所以如果您在代码中使用
char
,它无论如何都会是
int
,因为假设处理器将使用汇编指令来处理它的词。

int
的历史来自 B 编程语言,它只有一种数据类型——处理器字。先知丹尼斯·里奇在创造 C 语言时添加了
char
来表示一个字节,而
int
则像 B 编程语言中一样表示处理器字。这就是为什么它是隐含的
int
,所以你可以像B中那样写
auto var;
。见https://www.bell-labs.com/usr/dmr/www/chist.htmlhttps:// en.wikipedia.org/wiki/B_(programming_language).

如今,您更喜欢

int_fastX_t
,例如
int_fast8_t
int_fast32_t
,具体取决于您要使用多少位。或者,最好的办法是在构建时使用构建系统检测处理器宽度,并编译针对特定处理器字大小优化的库。

我的直觉说这是可能的,但不能移植到 x86)。

使用不同的数据类型是一种优化,可以在特定架构上产生更快的代码,而不是可移植性问题。如果你坚持 C 编程语言所保证的,那么代码将在任何地方运行。

long
至少 32 位——在 64 位处理器上它可能有 32 位,它可能是 64 位,它可能有 36 位,任何高于 32 位的数字。它的大小完全取决于编译器和系统。但是现在只有 32 和 64 重要,请参阅https://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models。如果你的意思是 64 位,请使用
uint64_t

unsigned int
写这样的代码。在当今的处理器上它将是 32 位的,并且任何当今的处理器都具有 32 位的所有指令。如果你将在具有 16 位 int 的 xc8 编译器上编写,你肯定会知道它。

© www.soinside.com 2019 - 2024. All rights reserved.