谁决定任何数据类型或结构的大小(取决于32位还是64位)?编译器还是处理器?例如,sizeof(int)
32位系统是4个字节,而64位系统是8个字节.
我还读到sizeof(int)
使用32位和64位编译器编译时的4个字节.
假设我的CPU能为64位应用程序,谁在决定数据的大小起到主要作用同时运行32位和该编译器或处理器?
我对OpenCV Mat元素类型感到困惑.这是来自文档:
There is a limited fixed set of primitive data types the library can operate on.
That is, array elements should have one of the following types:
8-bit unsigned integer (uchar)
8-bit signed integer (schar)
16-bit unsigned integer (ushort)
16-bit signed integer (short)
32-bit signed integer (int)
32-bit floating-point number (float)
64-bit floating-point number (double)
...
For these basic types, the following enumeration is applied:
enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=4, CV_32F=5, CV_64F=6 };
Run Code Online (Sandbox Code Playgroud)
众所周知,C++标准没有以字节为单位定义基本类型的大小,那么他们如何使用这些假设呢?我应该期待什么类型,比方说CV_32S,是int32_t还是int?
是否有标准投诉方法来表示ANSI(C89/90)C中的字节?我知道,大多数情况下,一个字符恰好是一个字节,但我的理解是,这不能保证是这种情况.另外,在C99标准中有stdint.h,但在C99之前使用了什么?
我特别想知道8位和"字节"(sizeof(x)== 1).
为什么int
64位编译器通常是32位?当我开始编程时,我被教过int通常与底层架构的宽度相同.我同意这也是有道理的,我发现未指定的宽度整数与底层平台一样宽是合乎逻辑的(除非我们说的是8或16位机器,这样的小范围int
几乎不适用).
后来我int
在大多数64位平台上学到的通常是32位.所以我想知道这是什么原因.对于存储数据,我更喜欢明确指定数据类型的宽度,因此这留下了通用用法int
,这不会提供任何性能优势,至少在我的系统上我对32位和64位整数具有相同的性能.这样就留下了二进制内存占用空间,虽然不是很多,但会略有减少.
将指针转换为int并稍后再返回指针是否安全?
如果我们知道指针是否为32位长且int是32位长怎么样?
long* juggle(long* p) {
static_assert(sizeof(long*) == sizeof(int));
int v = reinterpret_cast<int>(p); // or if sizeof(*)==8 choose long here
do_some_math(v); // prevent compiler from optimizing
return reinterpret_cast<long*>(v);
}
int main() {
long* stuff = new long(42);
long* ffuts = juggle(stuff);
std::cout << "Is this always 42? " << *ffuts << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
这是否包含在标准中?
有没有办法避免Graph::
实现文件中的重复,但仍然将类拆分为头+实现?如:
头文件:
#ifndef Graph_H
#define Graph_H
class Graph {
public:
Graph(int n);
void printGraph();
void addEdge();
void removeEdge();
};
#endif
Run Code Online (Sandbox Code Playgroud)
实施档案:
Graph::Graph(int n){}
void Graph::printGraph(){}
void Graph::addEdge(){}
void Graph::removeEdge(){}
Run Code Online (Sandbox Code Playgroud) 我有类似的东西:
int8_t value;
value = -27;
std::cout << value << std::endl;
Run Code Online (Sandbox Code Playgroud)
当我运行我的程序时,我得到一个错误的随机值<E5>
输出到屏幕,但当我在gdb中运行该程序并使用p value
它打印出-27,这是正确的值.有没有人有任何想法?
对于我的一个C++编程分配,我必须在设计程序时考虑整数变量的大小.我在互联网上阅读,大多数地方都说"整数的大小取决于平台." 我不清楚这意味着什么,所以我在这里问.
是什么决定了原始数据类型的大小?
2 byte
在某些系统中选择一个整数大小为s 的原因是什么,4 byte
在其他系统中选择s 的原因是什么?有什么理由不能继续2字节吗?
原始数据类型的大小究竟int
取决于什么?
或者它是这些或其他因素的组合?
对其原因的解释将非常有帮助.
编辑:对不起混淆..我想询问关于原始数据类型如int而不是关于POD,我确实理解POD可以包括结构和结构它是一个完全不同的球游戏与填充进入图片.我已经更正了Q,这里的编辑说明应该确保关于POD的答案看起来不相关.
一位同事和我一直在讨论如何通过FFI bool
从<stdbool.h>
(又名_Bool
)返回Rust.
我们想要在Rust中使用我们的C99代码:
bool
myfunc(void) {
...
}
Run Code Online (Sandbox Code Playgroud)
我们让Rust了解myfunc
使用extern C
块:
extern "C" {
fn myfunc() -> T;
}
Run Code Online (Sandbox Code Playgroud)
具体类型应该T
是什么?
锈没有c_bool
在libc
箱子的,如果你在网上搜索,你会发现各种GitHub的问题和RFC中,人们讨论这个问题,但真的不来,什么是正确和便携式任何共识:
据我所知:
这一评论表明,如果一个C99 bool
被传递给函数的参数或出功能的返回值,并在bool
比C的情况下int
则提升到相同大小作为int
.在这种情况下,我们可以告诉Rust T
是u32
.
好吧,但如果(由于某种原因)C99 bool
是64位宽怎么办?是否u32
还安全吗?也许在这种情况下,我们会截断4个最重要的字节,这很好,因为4个最低有效字节足以表示true
和false
.
我的推理是否正确?在Rust得到之前libc::c_bool
,你将使用什么? …