c - 将 LONG 除以 INT 并分配给 SHORT - 在一种情况下可能吗?

标签 c winapi windows-console

我正在手动计算 Windows 控制台中的单元格数量。 (是的,我知道可以从填充的 CONSOLE_SCREEN_BUFFER_INFO 结构中获取此信息。)

#include <windows.h>
#include <stdio.h>

int main(void)
{
    HANDLE hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
    RECT workarea;
    COORD c;

    SystemParametersInfoW(SPI_GETWORKAREA, 0, &workarea, 0);
    printf("Rectangle: %ld x %ld\n", workarea.right, workarea.bottom);
    c.X = workarea.right / 8;
    c.Y = workarea.bottom / 12;
    printf("Cells: %d x %d\n", c.X, c.Y);

    return 0;
}

RECT 工作区 是一个包含四个长整数的结构。 COORD c 是一个包含两个短整数的结构。

将长整数除以整数(例如,如上所述的 8 或 12)时,将所得常量分配给短整数是否存在问题?正如预期的那样,Visual Studio 2012 会生成编译时警告。

但是在测试这个特殊情况时,SystemParametersInfoW(SPI_GETWORKAREA, 0, &workarea, 0) 只给出 RECT workarea 我的桌面分辨率减去任务栏高度(例如 1680) x 1010 像素)。

当然,这些数字完全在短整数范围内。所以,我想问题是:在这种特殊情况下是否有可能丢失数据?

最佳答案

当您将 longint 相除时,结果将具有数据类型 long(两者中较大的一个)。 如果结果适合 short,则将结果分配给 short 时不会丢失数据。

关于c - 将 LONG 除以 INT 并分配给 SHORT - 在一种情况下可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19420357/

相关文章:

c - 当将类型化指针传递给接收 void ** 的函数时,GCC 会发出警告

c - 在 c 中使用 strcpy 通过函数初始化结构

c - 为什么我不能从 WriteConsole 重定向输出?

C:结构和数组 - 概述和需要的帮助

将二进制字符串转换为整数

c++ - 在运行时从内存中加载动画光标

c - Win32 匿名管道在首次读取后损坏

c++ - 如何使用 Code::Blocks 链接到库?

更改 Windows 控制台大小

powershell - 如何在 powershell 中使用 SetConsoleMode 更改控制台输出模式?