gpt4 book ai didi

windows - 64 位系统的整数大小差异(与我的旧 32 位 pc 系统混淆)

转载 作者:可可西里 更新时间:2023-11-01 11:09:29 24 4
gpt4 key购买 nike

几个月前,我给自己买了一台配备 CPU intel i7-2630qm 和 64 位 Windows 的笔记本电脑。在这个系统下练习我的编程技能时,我遇到了一些整数大小方面的差异,这让我认为这可能是由于我的新 64 位系统。

让我们看一段代码。

C 代码:

#include <stdio.h>

int main(void)
{
int num = 20;

printf("%d %lld\n" , num , num);

return 0;
}

问题:

1.) 我记得在得到这台新笔记本电脑之前,这意味着我仍在使用我的旧 32 位系统,当我运行这段代码时,程序将打印整数 20由于 %lld 说明符,它旁边有一些随机数。

2.)但是当我使用我的新笔记本电脑时,这种现象不再发生,它会正确地打印两个整数,即使我将变量 num 更改为键入 short.

3.)它是否在 64 位系统上,有新的整数提升,当它用作参数时将 int 提升为 long long?还是 short 整数可以提升为 long long 当作为参数传递时也是 64 位的??

4.)除此之外,我对一件事很困惑,在 16 位系统上,int 将是 16 位,而在 32 位系统上将是 32 位system.But为什么在64位的时候没有变成64位的呢??

============================================= ===================================插件:

1.)我在使用我的新笔记本电脑时在 IDE 上选择“控制台程序(64 位)”作为我的项目,但在我的 32 位旧 PC 系统上选择“控制台程序”。

2.)我已经使用 sizeof 运算符检查“控制台程序(64 位)”项目下 int 的大小,它返回 32 位,而 short 仍然是 16 位的。唯一的变化是 long 类型,它是 64 位的,long long 仍然是它通常的 64 位大小。

最佳答案

您看到此副作用是因为 x64 代码的调用约定不同。 32 位 x86 代码中的函数参数在堆栈上传递。 printf() 函数将从堆栈中读取一个不属于激活帧的单词。它包含 0 值的可能性极低。

在 x64 代码中,函数的前 4 个参数通过 cpu 寄存器而不是堆栈传递。 64 位寄存器的高位字偶然为零的可能性很大。之前处理小数字的 64 位操作留在那里。但肯定不能保证。

尝试从未定义的行为中推断出已定义的行为是没有用的。除了尝试猜测该语言是如何为您机器中的核心实现的。有更好的资源。学习适用于您的编译器的机器代码是一个极好的捷径。与体面的调试器一起向您展示您的 C 代码是如何被翻译成机器代码的。机器代码没有未定义的行为。

关于windows - 64 位系统的整数大小差异(与我的旧 32 位 pc 系统混淆),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7463745/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com