рдХреЛрдб рдХреА рдЫрд╣ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдВрдбреЛрдЬ рдХреЛ рдХреИрд╕реЗ рдбреНрд░реЙрдк рдХрд░реЗрдВ

рдЗрд╕реЗ рднреА рджреЗрдЦреЗрдВ: Microsoft рдиреЗ рддрдп рдХреА рдмреНрд▓реВ рд╕реНрдХреНрд░реАрди рднреЗрджреНрдпрддрд╛

рдПрдХ рдмрд╛рд░, рдПрдХ рдорд┐рддреНрд░ рдиреЗ рдореБрдЭреЗ рд╡рд┐рдВрдбреЛрдЬ рдореЗрдВ рднреЗрджреНрдпрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдпрд╛ред рдЗрд╕рдХреЗ рдХрд╛рд░рдг, рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ C рдХреЛрдб рдХреА рдЫрд╣ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдореМрдд рдХреА рдиреАрд▓реА рд╕реНрдХреНрд░реАрди рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдХрд┐рд╕реА рднреА рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдЕрдзрд┐рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдВрдбреЛ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред




рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдмрд┐рдЯ

рдПрдХ рдЕрдорд╛рдиреНрдп рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░реЛрд╕реЗрд╕рд░ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдУрдПрд╕ рдЦреБрдж рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╕рд┐рд╕реНрдЯрдо рд╕рднреА рдХреЛ рдПрдХ рдЬреНрдЮрд╛рдд рд╕рдВрджреЗрд╢ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдиреЗ рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдХреЛрдб рдореЗрдВ рд╢реВрдиреНрдп рд╕реЗ рднрд╛рдЧ рджреЗрдирд╛ рдПрдХ рдЕрдорд╛рдиреНрдп рдирд┐рд░реНрджреЗрд╢ рд╣реИред
#include <stdio.h>

int main()
{
    int a = 2 / 0;
    printf ("%d", a);
    return 0;
}

, (, warning).

, : .

INT_MIN / -1

тАФ INT_MIN -1.
, INT_MIN=тИТ2,147,483,648=-231, INT_MAX=2,147,483,647=231-1. , : int , , .
, INT_MIN -1 int .

, , :
#include <stdio.h>
#include <limits.h>

int main()
{
    int a = INT_MIN;
    int b = -1;
    int c = a / b;
    printf ("%d", c);
    return 0;
}


Windows

Windows . - . - , : .
WinAPI , , . тАФ ScaleWindowExtEx. тАФ .
:
BOOL ScaleWindowExtEx(
  _In_   HDC hdc,
  _In_   int Xnum,
  _In_   int Xdenom,
  _In_   int Ynum,
  _In_   int Ydenom,
  _Out_  LPSIZE lpSize
);



, , . , тАФ .
Xnum / Xdenom тАФ x.
Ynum / Ydenom тАФ y.
. , (device context) . , , - . , SetLayout.
, CreateCompatibleDC (NULL). SetLayout. ScaleWindowExtEx .
, , Windows .
INT_MIN -1 . - , .
gdi32.lib Windows:
#include <windows.h>
#include <limits.h>

int main()
{
	HDC dc = CreateCompatibleDC (NULL);
	SetLayout (dc, LAYOUT_RTL);
	ScaleWindowExtEx (dc, INT_MIN, -1, 1, 1, NULL);
}

:
#include <windows.h>
int main() {
	HDC dc = CreateCompatibleDC (NULL);
	SetLayout (dc, LAYOUT_RTL);
	ScaleWindowExtEx (dc, -2147483647 - 1, -1, 1, 1, NULL);
}

INT_MIN -2147483648, , limits.h. , , . - .

Windows Vista, 7 8. 32- , 64- ( 64- ).

P.S. bash, .

UPDATE1: ((int) 0x8000/0x80000000) (-2147483647 тАФ 1), . , AndreyDmitriev alper.
UPDATE2: Microsoft .
UPDATE3: ┬л┬╗: blog.cmpxchg8b.com/2013/02/the-other-integer-overflow.html.

Source: https://habr.com/ru/post/In179543/


All Articles