加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 为什么这个unsigned int包含的数据多于内存数量?

发布时间:2020-12-16 07:51:36 所属栏目:百科 来源:网络整理
导读:unsigned int只能容纳32位数据.当我为它分配一个比它能容纳的值更大的值时,为什么编译器不会给出错误? 我尝试了其他各种值,但仍然没有错误. int main(){ unsigned int mem = 0x89678456543454345934; cout mem; return 0;} 解决方法 那是因为0x896784565434
unsigned int只能容纳32位数据.当我为它分配一个比它能容纳的值更大的值时,为什么编译器不会给出错误?

我尝试了其他各种值,但仍然没有错误.

int main()
{
    unsigned int mem = 0x89678456543454345934;
    cout << mem;

    return 0;
}

解决方法

那是因为0x89678456543454345934大于std :: numeric_limits< unsigned_int> :: max().但是,无符号类型会绕过它们的最大值,因此如果右侧可以用整数类型表示,那么您可以很好地定义行为.在这种情况下,结果是0x89678456543454345934 mod std :: numeric_limits< unsigned_int> :: max.

编辑

赋值的右侧是integer literal.为了表示它,编译器使用整数文字可以适合的第一种类型(按其大小排序).如果没有这种类型,那么程序就是格式错误.常量的十进制值是:

648873758694578209446196L

在我的机器上,对于clang和g std :: numeric_limits< unsigned long long> :: max()是18446744073709551615,它小于你的常量.看起来你的程序是不正确的,除非编译器使用超过64位代表无符号长long,我对此非常怀疑.正如@juanchopanza所说,clang拒绝编译代码,但错误

error: integer constant is larger than the largest unsigned integer type

然而,g继续前进并编译它,只发出一个警告

warning: large integer implicitly truncated to unsigned type

警告很混乱,因为它指的是右侧,而不是进一步转换为unsigned int,因为它得到了

warning: large integer implicitly truncated to unsigned type [-Woverflow]

在我的机器上,std :: numeric_limits< unsigned int> :: max()是4294967295,因此648873758694578209446196L%4294967295是3633002191L.但是,当我运行你的程序时,我得到1412716852.这是因为程序格式错误,不幸的是编译器没有发出错误(它不是标准规定的),而只是一个警告.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读