已经阅读了这个相关的问题,但正在寻找一些更具体的东西.
int
-sized值传递?如何确定CPU的字大小?如果我理解正确,int
一个字应该是正确的吗?我不确定我是否正确.
那么打印sizeof(int)
是否足以确定我的处理器的字大小?
什么是大小tword
,oword
以及yword
操作数,如使用NASM/YASM手册?在相关的说明中,这些名称是否存在技巧或潜在的想法?有没有一种方法可以为更大的字大小赋予逻辑名称?
我知道,虽然字大小可以系统之间是不同的,一个NASM word
是2个字节,dword
是两倍(4个字节),qword
是一个四字(8个字节),但是...是tword
一个三重字(6个字节)?而对于oword
和yword
我甚至不能想象的一个似是而非的含义.
请注意,这可能是一个简单的问题,但我找不到答案.在NASM和YASM手册这些尺寸没有解释,甚至没有在DQ
,DT
,DY
,RESQ
,REST
,RESY
伪指令.我读到MASM使用类似系统的地方,但也找不到任何东西.
编辑:根据答案,这是完整的列表:
byte
DB
RESB
word
DW
RESW
dword
DD
RESD
qword
DQ
RESQ
tword
DT
REST
oword
,DO
,,RESO
DDQ
RESDQ
yword
DY
RESY
简单地放入C和变体(与wuss java及其虚拟机不同),不同目标上的基元类型的大小可能会有很大差异,除非您使用定义的固定宽度类型stdint.h
,否则实际上无法保证,甚至您的实现也是如此支持他们.
无论如何假设(因为在大多数现代机器上,一个字节是八位字节,为了网络目的,我假设(ASCII))sizeof是以字节还是以八位字节的形式返回数据类型的大小?
在80年代从16位转换到32位期间,int
是16位或32位.使用当前的64位转换命名法,我知道ILP32和LP32机器的传播非常均匀.当时我相信它被理解为int
总是遵循任何给定架构的寄存器或指针宽度,并且long
将保持32位.
快进25年,我发现LP64是相当主流的,但直到我遇到64位平台[我在2007年发现桌面Linux :)],我总是期望IP64成为下一个合乎逻辑的步骤.
char <= short <= int <= long
关系如何适应这种将整数类型固定到我们留下的每个平台的新方案?{l,u}case
)WORD
/ DWORD
在各种平台上使用相关?INT
16位的表单.Windows会不会发展成LLP64还是为时已晚?int
选择这次被抛弃,而不是在32位过渡期间?我经常看到像这样的 pprograms ,Int64
在32位平台上绝对是性能杀手.我现在的问题是:
如果我的任务需要特定的字长(在我的情况下是RNG),Int64
在64位平台上是否有效或者它仍然会使用C调用吗?而如何有效的转化的Int64
一个Int
?
atomicAdd
我在 CUDA 7 下使用时遇到问题。atomicAdd
定义为“ int
”、“ unsigned int
”和“ unsigned long long int
”,说明它使用“32 或 64 位值”。
为了安全起见,在我们的代码中我们使用uint32_t
和uint64_t
。然而 gcc 是这样定义的:
#if __WORDSIZE == 64
typedef unsigned long int uint64_t;
#else
__extension__
typedef unsigned long long int uint64_t;
#endif
Run Code Online (Sandbox Code Playgroud)
因此,当我将 an 传递uint64_t
给atomicAdd
它时,它会抱怨,因为它没有为“ unsigned long int
”定义。
是否可以uint64_t == long long int
按照编程指南中所述假设进行 CUDA 编译?
考虑以下程序
#include <cstdio>
#include <stdint.h>
struct Foo
{
int32_t a;
int32_t b;
int32_t c;
};
struct Bar
{
int32_t a;
int32_t b;
int16_t c;
};
int main()
{
printf("sizeof(Foo)=%u\nsizeof(Bar)=%u",sizeof(Foo),sizeof(Bar));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在使用MinGW进行编译时,我在32位和64位系统上得到sizeof(Foo)= 12和sizeof(Bar)= 12(我想在16位环境中,sizeof(Bar)= 10).是否有可能在未来,这些结构的大小将是16,以便在64位环境中更好地适应?
我将结构存储在文件中,并且不希望将来添加解决方法.Doom的东西结构布局可能是一个很好的选择1993但不是今天.
我有以下C功能:
void function(int a) {
char buffer[1];
}
Run Code Online (Sandbox Code Playgroud)
它产生以下汇编代码(gcc,0优化,64位机器):
function:
pushq %rbp
movq %rsp, %rbp
movl %edi, -20(%rbp)
nop
popq %rbp
ret
Run Code Online (Sandbox Code Playgroud)
问题:
char buffer
而不是char buffer[1]
偏移是4个字节,但我希望看到8,因为机器是64位,我认为它将使用qword(64位).在此先感谢,如果问题重复,我很抱歉,我无法找到答案.