рд╕реА рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рджреЛ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕

рдореИрдВ рджреЛ рд╡рд┐рд╖рдорддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреЛ рдореБрдЭреЗ рд╕реА рдореЗрдВ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдерд╛

рддреЛ, рдХреБрдЫ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ред рдпрд╣рд╛рдБ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИред

#include <stdio.h> int main() { unsigned char a = 1, b; b = ~a >> 1; printf("%u\n", b); return 0; } 


рдЖрдЗрдП рдЗрд╕рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВред рдмрд┐рдЯрд╡рд╛рдЗрдЬрд╝ рдСрдкрд░реЗрд╢рди ~ рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдЯ рдСрдлрд╝ рдж рд╕реНрдЯреЗрдЯ рдХреЛ рдмрд╛рдЗрдЯ рдХрд░рддрд╛ рд╣реИ a , рдЬрд┐рд╕рдореЗрдВ рдпреВрдирд┐рдЯ рдореВрд▓ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдкрд░рд┐рдгрд╛рдо 11111110b , рдпрд╛рдиреА 254 рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдмрд╛рдЗрдЯ рдХреЛ рджрд╛рдИрдВ рдУрд░ рдПрдХ рдмрд┐рдЯ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдкрд░ 127 рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐, рджрд┐рдП рдЧрдП рдХреЛрдб, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, gcc рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛, рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП 255 рдЖрдЙрдЯрдкреБрдЯ рд╣реИ ?!

рдкрд╣рд▓реЗ рддреЛ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдорд╛рдорд▓рд╛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХрд╛ рд╣реИ - рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ "рдореЙрд╡" рд╣реИ? рдпрд╣реА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдкрд╣рд▓реА рдмрд╛рд░ рдПрдХ рдмрджрд▓рд╛рд╡ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ - рдЙрд▓рдЯрд╛ (рдФрд░ рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ ...)ред рддреЛ рд╕реМрджрд╛ рдХреНрдпрд╛ рд╣реИ?

рдХреБрдЫ рд╡рд┐рдЪрд╛рд░-рд╡рд┐рдорд░реНрд╢ рдХреЗ рдмрд╛рдж, рдПрдХ рдФрд░ рдкрд░рд┐рдХрд▓реНрдкрдирд╛ рдореЗрд░реЗ рд╕рд┐рд░ рдкрд░ рдЖрдИ рдХрд┐ рдЬрдм рдЗрдиреНрд╡рд░реНрдЯрд┐рдВрдЧ рдмрд╛рдЗрдЯреНрд╕ рдПрдХ рд╢рдмреНрдж (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛ рдПрдХ рджреЛрд╣рд░реЗ рд╢рдмреНрдж) рддрдХ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЙрд▓реНрдЯреЗ рд╢рдмреНрдж рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣реА рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ 255 рд╕реЗ рдЖрддрд╛ рд╣реИ - рд╢рдмреНрдж рд╢реВрдиреНрдп рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯреНрд╕, рдЙрдиреНрд╣реЗрдВ рдЙрд▓рдЯрддреЗ рд╣реБрдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрдХрд╛рдЗрдпрд╛рдВ рд╣реИрдВред рдлрд┐рд░, рдПрдХ рд╢рдмреНрдж рдХреЛ рджрд╛рдИрдВ рдУрд░ рдПрдХ рдмрд┐рдЯ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛, рдЗрд╕рдХреЗ рдХрдо рд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдЗрдЯ рдореЗрдВ рд╕рднреА рдмрд┐рдЯреНрд╕ рдореЗрдВ рдЗрдХрд╛рдЗрдпрд╛рдВ рд╣реЛрдВрдЧреАред

рдЗрд╕рдХреА рдкреБрд╖реНрдЯрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдХреА рдЬрд╛рддреА рд╣реИред

 #include <stdio.h> int main() { unsigned char a = 1, b; b = (unsigned char)~a >> 1; printf("%u\n", b); return 0; } 

рдЕрдм рд╣рдореЗрдВ рдЗрд╕рдХрд╛ рд╕рд╣реА рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдЦрд┐рд░рдХрд╛рд░ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЖрд╢реНрд╡рд╕реНрдд рд╣реЛ рдЧрдпрд╛ рдХрд┐ рдИрдПрд▓рдПрдл рдлрд╛рдЗрд▓ рдЬреЛ рдХрд┐ рдЬреАрд╕реАрд╕реА рджреЗрддрд╛ рд╣реИ, рдХреЛ рдбрд┐рд╕рд╛рдЗрдб рдХрд░рдХреЗ ред рдореИрдВ рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рджреВрдВрдЧрд╛ред

 mov [ebp+var_6], 1 movzx eax, [ebp+var_6] not eax sar eax, 1 mov [ebp+var_5], al 

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

рдЬреИрд╕рд╛ рдХрд┐ рдмрд╛рдж рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛, рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЗрдВрдЯреЗрдЧрд░ рдкреНрд░рдореЛрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ C99 рдорд╛рдирдХ рдХреЗ рдЦрдВрдб 6.3.1.1 рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдЖрдк рдЗрд╕реЗ рдпрд╣рд╛рдБ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf

рдХреБрдЫ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╣реИред

 #include <stdio.h> int main() { float a = 1.005, b = 1000; int c = a*b; printf("%d\n", c); return 0; } 

рдЗрд╕реЗ 4.1.1 gcc рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдкрд░ , рдореБрдЭреЗ 1004 рдорд┐рд▓рддреЗ рд╣реИрдВред рдлрд┐рд░ рд╕рд╡рд╛рд▓ - рдЕрдЬреАрдм рдкрд░рд┐рдгрд╛рдо рдХрд╣рд╛рдБ рд╕реЗ рдЖрддрд╛ рд╣реИ? рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐

 int c = (float)(a*b); 

рднреА рд╕рд╣реА рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред

C89 рдорд╛рдирдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЪрдврд╝рддреЗ рд╣реБрдП, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЙрд╕рдиреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рд╡рд┐рдирд┐рдпрдорд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рдЬрдм рдПрд╕рдПрд╕рдИ рд╡рд┐рд╕реНрддрд╛рд░ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рддреЛ рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдиреЗ рдорд┐рд╢реНрд░рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдЧрдгрдирд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ - рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддреЗрдЬреА рд╕реЗ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИ: рдПрдлрдкреАрдпреВ рдкрд░ рдХреБрдЫ, рдПрд╕рдПрд╕рдИ рдкрд░ рдХреБрдЫред рдирдП C99 рдорд╛рдирдХ рдореЗрдВ рдХреБрдЫ рдирд┐рд╢реНрдЪрд┐рддрддрд╛ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЙрд╕ рдорд╛рди рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛ рдорд╛рди FLT_EVAL_METHOD (рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдлрд╝рд╛рдЗрд▓ float.h ) рдХреЛ 0 , 1 , 2 рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рддреЛ, 0 - рд╕рдм рдХреБрдЫ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ; 1 - рдлреНрд▓реЛрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбрдмрд▓ рдореЗрдВ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╡рд╛рдкрд╕ рдлреНрд▓реЛрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛрддрд╛ рд╣реИ; 2 - рдХреНрд░рдорд╢рдГ рдЧрдгрдирд╛ рдХреЗ рдЕрдВрдд рдореЗрдВ рдлреНрд▓реЛрдЯ рдпрд╛ рдбрдмрд▓ рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рддреЗ рд╣реБрдП рд╕рдм рдХреБрдЫ рд▓рдВрдмреЗ рдбрдмрд▓ рдореЗрдВ рдЧрд┐рдиреЗрдВред

рдЕрдм, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЧрд┐рдирддреА рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

 gcc proga.c -msse 

рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдореБрдЭреЗ рдХрдВрд╕реЛрд▓ рдореЗрдВ 1005 рдорд┐рд▓реЗред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ gcc рд╕рдВрдХрд▓рдХ рдХрд╛ рдореЗрд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рдореИрдХреНрд░реЛ FLT_EVAL_METHOD рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╡реИрд╕реЗ, рдбрдмрд▓ рдЬреАрд╕реАрд╕реА рдХреЗ рд╕рд╛рде рдПрдХ рдХреЛрдб рдЖрдЙрдЯрдкреБрдЯ 1004 рджреЗрддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдЗрдВрдЯреЗрд▓ рд╕реА 9.0 рдиреЗ рджреЛрд╣рд░реЗ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рдмрдирд╛рдпрд╛, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВрдиреЗ рд▓рд┐рдЦрд╛

 int c = (float)(a*b); 

(рдпрд╣рд╛рдВ рдП рдФрд░ рдмреА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЯрд╛рдЗрдк рдбрдмрд▓ рд╣реИрдВ )ред рдЯрд╛рдЗрдк рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛, рд╡рд╣рд╛рдБ рдХреЛрдб рднреА 1004 рджреЗрддрд╛ рд╣реИред

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


All Articles