2013-10-17 65 views
0

我正在手動計算Windows控制檯中的單元格數量。 (是的,我知道這個信息是從一個充滿CONSOLE_SCREEN_BUFFER_INFO結構。)用INT劃分LONG並分配給SHORT - 可能在一種情況下?

#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, &workarea, 0)僅給出了我的桌面分辨率減去任務欄高度(例如1680 x 1010像素)的RECT workarea

這些數字當然是在短整數範圍內。所以,我想這個問題是:在這種特殊情況下是否存在數據丟失的可能性?

回答

1

當您將longint分開時,結果的數據類型將爲long(兩者中較大者)。 如果結果符合short,則將結果分配給short時不會丟失數據。

+0

很好的答案,謝謝。所以如果你有'long int i = 100'並且想要將它放在'short int j'中,它就適合了。這是因爲'i'實際上是'100'而不是'0000000100'(一個10位的數字)? –

+0

C中的整數類型總是數字,所以是的,'i'實際上是'100'。 –

+0

只要分割的結果保證小於或等於32,767,就不會有問題。如果它大於這個值,你會有數值溢出。在你的情況下,這意味着只要分辨率保持低於水平261408像素和垂直392112像素,你的程序就能按預期工作。 –

相關問題