ν‹°μŠ€ν† λ¦¬ λ·°

728x90
λ°˜μ‘ν˜•
λ ‰ν† ν”Όμ•„ μ •ν˜œκ²½ κ°•μ‚¬λ‹˜μ˜ Secure & Generic C κ°•μ˜λ₯Ό λ“£κ³ , μ •λ¦¬ν•œ λ‚΄μš©μž…λ‹ˆλ‹€. 
ν•΄λ‹Ή λ‚΄μš©μ˜ μ €μž‘κΆŒμ€ μ •ν˜œκ²½ κ°•μ‚¬λ‹˜μ—κ²Œ μžˆμŠ΅λ‹ˆλ‹€.

μ‹œμŠ€ν…œμ— λ”°λ₯Έ 데이터 νƒ€μž…μ˜ 차이

 μ‚¬μš©ν•˜λŠ” μ‹œμŠ€ν…œ(ARM, POSIX)에 따라 같은 데이터 νƒ€μž…μ΄λΌκ³  ν•˜λ”λΌλ„ 크기가 λ‹€λ₯Ό 수 μžˆλ‹€. 이λ₯Ό μΈμ§€ν•˜μ§€ λͺ»ν•˜κ³  μ½”λ“œλ₯Ό μž‘μ„±ν•œλ‹€λ©΄ μ›μΉ˜ μ•ŠλŠ” κ²°κ³Όλ₯Ό μ΄ˆλž˜ν•œλ‹€. μ˜ˆλ₯Ό λ“€μ–΄ 64bit λ¦¬λˆ…μŠ€ μ‹œμŠ€ν…œμ—μ„œ 정상 λ™μž‘ν•˜λ˜ μ½”λ“œκ°€ μœˆλ„μš° 32bitμ—μ„œλŠ” λ™μž‘ν•˜μ§€ μ•Šμ„ 수 μžˆλ‹€.

 

#include <stdio.h>

int main()
{
	unsigned int a, b;
    unsigned long c;
    
    a = 100000000;
    b = 1001;
    c = (unsigned long)a * b;
    
    printf("c = %lu\n", c);
        
     return 0;
}

 μœ„μ˜ μ½”λ“œλŠ” 64bitμ—μ„œλŠ” `overflow`κ°€ λ°œμƒν•˜μ§€ μ•Šμ§€λ§Œ, 32bit일 경우 `overflow`κ°€ λ°œμƒν•œλ‹€.

 

데이터 νƒ€μž…μ˜ λ²”μœ„

#include <stdio.h>

int main()
{
    char i;
    
    for (i = 0; i < 50; i--) {
        //do something
    }
    
    for (i = 0; i < 150; i++) {
        //do something
    }
}

 μœ„ μ½”λ“œλŠ” 데이터 νƒ€μž…μ˜ λ²”μœ„μ— 따라 μ›μΉ˜ μ•ŠλŠ” κ²°κ³Όλ₯Ό λ§Œλ“€κ³ , 이λ₯Ό 이해할 수 μžˆλŠ”μ§€ νŒλ‹¨ν•  수 μžˆλŠ” κ°„λ‹¨ν•œ μ½”λ“œμ΄λ‹€. 첫 번째 반볡문의 경우 `char`이 0λΆ€ν„° `--i`λ₯Ό 톡해 1μ”© κ°μ†Œν•˜κ²Œ λœλ‹€. μ΄λŠ” 0λΆ€ν„° -128κΉŒμ§€ κ°μ†Œν•˜λ‹€κ°€ ν•œλ²ˆ 더 κ°μ†Œν•˜κ²Œ 되면 char maxκ°’μœΌλ‘œ λ°”λ€Œμ–΄ 127이 λ˜μ–΄ μ€‘λ‹¨λ˜κ²Œ λœλ‹€. 즉, λ°˜λ³΅λ¬Έμ€ 129회 μˆ˜ν–‰λœλ‹€.

 μ΄μ™€ 달리 두 번째 λ°˜λ³΅λ¬Έμ€ char의 λ²”μœ„μΈ `-128 ~ 127`의 λ²”μœ„λ₯Ό 계속 λ°˜λ³΅ν•˜λ―€λ‘œ, 150을 λ„˜μ„ 수 없기에 λ¬΄ν•œ 루프에 λΉ μ§€κ²Œ λœλ‹€.

 

μ •μˆ˜ λ³€ν™˜ κ·œμΉ™

 μ •μˆ˜ λ³€ν™˜μ€ μΊμŠ€νŒ…μ„ ν†΅ν•œ λͺ…μ‹œμ  λ³€ν™˜κ³Ό μžλ™ ν˜•λ³€ν™˜μ΄ μžˆλ‹€. λ˜ν•œ λ‹€μŒκ³Ό 같은 μ •μˆ˜ λ³€ν™˜ κ·œμΉ™μ„ λ”°λ₯΄κ²Œ λœλ‹€.

 

  • μ •μˆ˜ μŠΉκ³„
    • `int`보닀 μž‘μ€ μ •μˆ˜ν˜•μ€ 연산이 μˆ˜ν–‰λ  λ•Œ `int` λ˜λŠ” `unsigned int`둜 λ³€ν™˜λ˜μ–΄ μ—°μ‚°λœλ‹€.
    • μ΄λŠ” 쀑간에 μ‚¬μš©λ˜λŠ” κ°’μ˜ `overflow`λ₯Ό μ˜ˆλ°©ν•˜κΈ° μœ„ν•¨μ΄λ‹€.
  • μ •μˆ˜ λ³€ν™˜ μˆœμœ„
    • λΉ„νŠΈμˆ˜κ°€ λ§Žμ€ 자료 ν˜•μ΄ μˆœμœ„κ°€ λ†’λ‹€.
    • long long int > long int > int > short > char
      • λͺ¨λ“  unsigned μ •μˆ˜ν˜• μˆœμœ„λŠ” μΌμΉ˜ν•˜λŠ” singed μ •μˆ˜ν˜•μ˜ μˆœμœ„μ™€ κ°™λ‹€.
  • 일반적인 μ‚°μˆ  λ³€ν™˜
    • 이항 μ—°μ‚° λ˜λŠ” μ‚Όν•­ μ—°μ‚° μ‹œμ— 적용 λœλ‹€.
    • λΉ„νŠΈμˆ˜κ°€ μž‘μ€ μ •μˆ˜ν˜•μ„ λΉ„νŠΈμˆ˜κ°€ 큰 νƒ€μž…μ˜ μ •μˆ˜ν˜•μœΌλ‘œ λ³€ν™˜ν•œλ‹€.
      • κ°’ 손싀 방지.
    • λΉ„νŠΈ μˆ˜κ°€ 큰 νƒ€μž…μœΌλ‘œ ν™•μž₯ν•  λ•Œ, sing이면 MSB와 λ™μΌν•œ κ°’μœΌλ‘œ 빈 곡간을 μ±„μš΄λ‹€.
    • 이와 달리 unsigned인 경우 0으둜 빈 곡간을 μ±„μš΄λ‹€.

 

μ •μˆ˜ μŠΉκ³„

signed char c1 = SCHAR_MAX;
unsigned char c2 = UCHAR_MAX;
signed long long c3 = c1 + c2;

 μ•žμ„œ μ„€λͺ…ν•˜μ˜€λ“―이, μ •μˆ˜ μŠΉκ³„λŠ” `int`보닀 μž‘μ€ νƒ€μž…μ˜ 경우 계산을 μœ„ν•΄ ν˜• λ³€ν™˜μ΄ μΌμ–΄λ‚˜λŠ” 과정이라고 ν•˜μ˜€λ‹€. μœ„μ˜ μ˜ˆμ‹œλŠ” `signed char`, `unsigned char`둜 μ„œλ‘œ λ‹€λ₯Έ νƒ€μž…μ˜ 연산을 μˆ˜ν–‰ν•˜λŠ” κ²½μš°μ΄λ‹€. 이λ₯Ό κ³„μ‚°ν•˜κΈ° μœ„ν•΄μ„œ c1은 `signed int`둜 λ³€ν™˜μ΄ 되고, c2λŠ” `unsigned int`둜 λ³€ν™˜μ΄ λœλ‹€. 두 값을 κ³„μ‚°ν•˜κΈ° μœ„ν•΄, 보닀 큰 값을 κ°€μ§€λŠ” `unsigned int`λ₯Ό κΈ°μ€€μœΌλ‘œ c1을 ν˜• λ³€ν™˜ν•˜μ—¬ κ³„μ‚°ν•˜κ²Œ λœλ‹€.

 

 μ •λ¦¬ν•˜μžλ©΄, `int` 보닀 μž‘μ€ νƒ€μž…μ˜ 경우 μ •μˆ˜ μŠΉκ³„κ°€ λ°œμƒν•˜λ©°, μŠΉκ³„ ν›„ λ™μΌν•œ νƒ€μž…μ΄ μ•„λ‹ˆλΌλ©΄ 보닀 μ΅œλŒ“κ°’μ΄ 큰 μžλ£Œν˜•μ— λ§žμΆ”μ–΄ λ‹€μ‹œ ν•œλ²ˆ ν˜• λ³€ν™˜μ„ ν•œ 후에 κ³„μ‚°ν•œλ‹€.

 

#include <stdio.h>

int main()
{
    int x = -1;
    unsigned int y = 1;
    
    if (x > y) {
    	printf("T\n");
    }
    else {
    	printf("F\n");
    }
}

 μœ„μ˜ μ½”λ“œλ„ ν˜•λ³€ν™˜μ„ μ΄ν•΄ν•˜μ§€ λͺ»ν•œλ‹€λ©΄ μ–΄λ–€ 값이 좜λ ₯λ˜λŠ”μ§€ μ•Œ 수 μ—†λ‹€. `int`보닀 `unsinged int`의 μ΅œλŒ“κ°’μ΄ 더 ν¬λ―€λ‘œ, 비ꡐ μ—°μ‚° μ‹œ `unsigned int`둜 ν˜• λ³€ν™˜μ΄ 이루어진닀. λ”°λΌμ„œ xλŠ” `UNIT_MAX`κ°€ 되며 κ²°κ³ΌλŠ” `T`κ°€ 좜λ ₯되게 λœλ‹€.

728x90
λ°˜μ‘ν˜•
λŒ“κΈ€
κΈ€ 보관함
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€