我正在玩一些c + +代碼,並發現,如果我開始一個無符號long與4294967295(其最大允許值),並添加讓我們說6我必須得到5,它的確!但是下面的加法操作,以及mod 255並沒有給出正確的答案。爲什麼會發生這種情況,以及如何避免這種情況?C++無符號長不包裹4294967295
Plataforms Tested:
Windows 7,Visual Studio C++:Works Fine;
CentOS release 6.6(Final),g ++:給出錯誤的答案;
下面的代碼見注:
#include <stdio.h>
int main(int argc, char *argv[]) {
unsigned long s1=4294967295;
unsigned long vp=245;
unsigned long a;
unsigned long b;
unsigned long result;
/* s1 is 4294967295 + 6 wich is 5 */
s1+=6;
a=s1;
b=255*vp*s1;
result = (a + b) % 255;
printf("s1=%u , a=%u , b=%u , (a+b)=%u , (a+b)%255= %u\n", s1, a, b, a + b, result);
/* s1 is a static value 5 */
s1=5;
a=s1;
b=255*vp*s1;
result = (a + b) % 255;
printf("s1=%u , a=%u , b=%u , (a+b)=%u , (a+b)%255= %u\n", s1, a, b, a + b, result);
return 0;
}
注: 如果我編譯使用Visual Studio的代碼,我得到正確的答案。
s1=5 , a=5 , b=312375 , (a+b)=312380 , (a+b)%255= 5
s1=5 , a=5 , b=312375 , (a+b)=312380 , (a+b)%255= 5
但是,如果我用gcc編譯版本4.4.7 20120313(紅帽4.4.7-11)(GCC)我得到:
s1=5 , a=5 , b=312375 , (a+b)=312380 , (a+b)%255= 6
s1=5 , a=5 , b=312375 , (a+b)=312380 , (a+b)%255= 5
如何能以g避免++?
_「如果我以4294967295(他的最大允許值)開始一個無符號長整型」_你在哪裏讀過這個? –