已经阅读了这个相关的问题,但正在寻找一些更具体的东西.
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使用类似系统的地方,但也找不到任何东西.
编辑:根据答案,这是完整的列表:
byteDBRESBwordDWRESWdwordDDRESDqwordDQRESQtwordDTRESToword,DO,,RESODDQRESDQywordDYRESY简单地放入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在各种平台上使用相关?INT16位的表单.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位).在此先感谢,如果问题重复,我很抱歉,我无法找到答案.