LoginSignup
2
5

More than 5 years have passed since last update.

unsigned charの足し算

Last updated at Posted at 2017-03-14
a.c
typedef unsigned char u8;

int checksum(const u8 *buf, size_t len)
{
    u8 sum = 0;
    size_t a;

    for (a = 0; a < len; a++)
        sum += buf[a];
    return (sum == 0);
}

dmidecodeのutil.cの内容だが、コンパイル時に警告を出すようにしていると、
以下のような警告が出てくる。

warning: conversion to ‘u8 {aka unsigned char}’ from ‘int’ may alter its value [-Wconversion]
         sum += buf[a];

u8同士を計算しているように見えるが、計算するときに暗黙でintで計算される。
このため、計算結果(int)から 、sum(u8)に変換すると値が変更されることがあります、と警告される。

警告を出さないように、以下のようにしてみた。

a.c
int checksum(const u8 *buf, size_t len)
{
    int sum = 0;
    size_t a;

    for (a = 0; a < len; a++)
        sum += buf[a];
    return ((0xff & sum) == 0);
}

足される側のsumを、最初からintにしておけば、計算結果もsumもintなので、警告は出ない。
ただ、sumがintになっているので、最終的に返す結果が異なってしまう。

1バイトから桁あふれした部分の値があると、1バイト分が0であっても、falseが返ってしまうので、
0xffとのandを取って、1バイト分が0なら、trueが返るようにした。


指摘の通り、以下で問題なかったです。ありがとうございます。

a.c
typedef unsigned char u8;

int checksum(const u8 *buf, size_t len)
{
    u8 sum = 0;
    size_t a;

    for (a = 0; a < len; a++)
        sum = (u8)(sum + buf[a]);
    return (sum == 0);
}

以下にも同じ内容がありました。。。
http://stackoverflow.com/questions/21335452/gcc-conversion-warning

2
5
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5