【问题标题】:Dividing LONG by INT and assigning to SHORT - Possible in one case?将 LONG 除以 INT 并分配给 SHORT - 在一种情况下可能吗?
【发布时间】:2013-10-17 07:09:17
【问题描述】:

我正在手动计算 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 workarea 是一个包含四个长整数的结构。 COORD c 是一个有两个短整数的结构体。

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

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

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

【问题讨论】:

    标签: c winapi windows-console


    【解决方案1】:

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

    【讨论】:

    • 很好的答案,谢谢。因此,如果您有 long int i = 100 并想将其放入 short int j,它会适合。这是因为i 实际上是100 而不是0000000100(一个有10 个位置的数字)?
    • C 中的整数类型总是只是数字,所以是的,i 实际上是100
    • 只要保证除法的结果小于等于32767就没有问题。如果它大于那个,你就会有数字溢出。在您的情况下,这意味着只要分辨率水平低于 261​​408 像素,垂直低于 392112 像素,您的程序就会按预期工作。
    猜你喜欢
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    相关资源
    最近更新 更多