ν°μ€ν 리 λ·°
λ ν νΌμ μ νκ²½ κ°μ¬λμ 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`κ° μΆλ ₯λκ² λλ€.
'πββοΈ νλ‘κ·Έλλ° μΈμ΄ > C' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
C: Generic Coding (0) | 2020.11.18 |
---|---|
C: λ€μν ν¬μΈν° (0) | 2020.11.17 |
C: ννμ (0) | 2020.11.14 |
C: μ μΈκ³Ό μ΄κΈ°ν (0) | 2020.11.14 |
C: 맀ν¬λ‘μ νμ© (0) | 2020.11.14 |