当前位置:网站首页>unsigned与signed之大白话

unsigned与signed之大白话

2022-06-25 22:06:00 彼岸的饭碗

闲谈
有符号与无符号,顾名思义,即有负号或无负号,unsigned即可定义无符号变量,即变量不会出现小于0的值,0-1此时会从上限值往下排列,因此我们看到了许多游戏中出现的一系列bug。

为了直观的看到他们的不同,我们直接上两盘小白代码

#include "stdio.h"
#include "iostream"

#define ull signed int
using namespace std;

int main(){
    
    int n=10;
    ull p=5;
    while(n>0){
    
        n--;
        p--;
        cout << p << '\n';
    }
    return 0;
}

输出结果:
在这里插入图片描述

#include "stdio.h"
#include "iostream"

#define ull unsigned int //这里有所不同
using namespace std;

int main(){
    
    int n=10;
    ull p=5;
    while(n>0){
    
        n--;
        p--;
        cout << p << '\n';
    }
    return 0;
}

输出结果:
在这里插入图片描述

无符号整型一般是常用于各种位运算、模运算、回绕溢出利用较多的算法实现中(比如各种加密学算法、编码、压缩算法等),或者是确实对数据表示范围有要求的场合(比如必须用16bit存储上限可以达到50000的量)。

一般应用中一个变量最好用有符号数(前提是这个变量不会和别的无符号变量有直接交互),即使是一些从意义上来说不会取负数的变量,可以避免一些容易疏忽的溢出漏洞,毕竟java基本类型中不支持无符号整型不是没有道理的。

例如你要倒序遍历某个数组的时候,有符号数可以直接写成
for(int i = size-1 ; i>=0 ; --i)但如果i是个无符号数,这么写就成了一个死循环。再比如《文明》中的核弹狂魔甘地就是由于无符号数的下溢出导致的。

原网站

版权声明
本文为[彼岸的饭碗]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_42392049/article/details/113631829