请问 size_t a=-1; 是否符合标准?

menzi11 2014-07-20 03:57:11
请问 size_t a=-1;或者 size_t b=1000; size_t a = -b; 是否符合标准? 咱先不管
溢出问题,我就是想让它溢出,只想知道这个是否符合标准? 谢谢!
...全文
278 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
dianyancao 2014-08-02
  • 打赏
  • 举报
回复
因为某些原因,C++编译器很保守,对于用代数符号计算能优化的,如果会产生溢出就不会按代数计算优化了 俺会把-1修改为size_t的最大值...虽然这样写是可以的
赵4老师 2014-07-21
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察
chenhengheng007 2014-07-21
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。) 不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 有人说一套做一套,你相信他说的还是相信他做的? 其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗? 不要写连自己也预测不了结果的代码!
你整天这样回帖有意思吗?
赵4老师 2014-07-21
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。) 不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 有人说一套做一套,你相信他说的还是相信他做的? 其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗? 不要写连自己也预测不了结果的代码!
wanght99 2014-07-21
  • 打赏
  • 举报
回复
引用 7 楼 zjq9931 的回复:
[quote=引用 6 楼 wanght99 的回复:] [quote=引用 3 楼 zjq9931 的回复:] [quote=引用 楼主 menzi11 的回复:] 请问 size_t a=-1;或者 size_t b=1000; size_t a = -b; 是否符合标准? 咱先不管 溢出问题,我就是想让它溢出,只想知道这个是否符合标准? 谢谢!
无符号和有符号的数运算的时候,统一转换成(强制转换)有符号的数。 所以-1就是最大值。这个不算是溢出。 b=1000;a=-b; 这个时候-b,比-1放到a里面小。 因为负数是以补码的形式存在的。 [/quote] 这里有一个小问题, 有符号和无符号整数运算的时候转换规则是 如果无符号类型可以无损地放在有符号类型里, 则转换成有符号类型, 否则转换成无符号类型, 如果无符号和有符号长度相等(如 int 和 unsigned int), 因为无符号数值域里有一半int表示不了, 所以是转换成无符号来运算的, 而不是有符号.[/quote] 无符号和有符号,的数,在内存里面是相等的。 无符号和有符号转换的时候符号位会出现问题。[/quote] 在内存里相等不代表"无损", 这里的"无损"指的是值不变, 如果变成负的不叫无损. 内存表示确实一样, 对于二进制补码来说, 很多算有符号和无符号结果一样, 但比较运算结果是不一样的:

#include <stdio.h>

int main (int argc, char const* argv[])
{
    int i = -1;
    unsigned int j = 1;

    if(i<j)
        printf("something");

    return 0;
}
  • 打赏
  • 举报
回复
引用 6 楼 wanght99 的回复:
[quote=引用 3 楼 zjq9931 的回复:] [quote=引用 楼主 menzi11 的回复:] 请问 size_t a=-1;或者 size_t b=1000; size_t a = -b; 是否符合标准? 咱先不管 溢出问题,我就是想让它溢出,只想知道这个是否符合标准? 谢谢!
无符号和有符号的数运算的时候,统一转换成(强制转换)有符号的数。 所以-1就是最大值。这个不算是溢出。 b=1000;a=-b; 这个时候-b,比-1放到a里面小。 因为负数是以补码的形式存在的。 [/quote] 这里有一个小问题, 有符号和无符号整数运算的时候转换规则是 如果无符号类型可以无损地放在有符号类型里, 则转换成有符号类型, 否则转换成无符号类型, 如果无符号和有符号长度相等(如 int 和 unsigned int), 因为无符号数值域里有一半int表示不了, 所以是转换成无符号来运算的, 而不是有符号.[/quote] 无符号和有符号,的数,在内存里面是相等的。 无符号和有符号转换的时候符号位会出现问题。
wanght99 2014-07-20
  • 打赏
  • 举报
回复
引用 3 楼 zjq9931 的回复:
[quote=引用 楼主 menzi11 的回复:] 请问 size_t a=-1;或者 size_t b=1000; size_t a = -b; 是否符合标准? 咱先不管 溢出问题,我就是想让它溢出,只想知道这个是否符合标准? 谢谢!
无符号和有符号的数运算的时候,统一转换成(强制转换)有符号的数。 所以-1就是最大值。这个不算是溢出。 b=1000;a=-b; 这个时候-b,比-1放到a里面小。 因为负数是以补码的形式存在的。 [/quote] 这里有一个小问题, 有符号和无符号整数运算的时候转换规则是 如果无符号类型可以无损地放在有符号类型里, 则转换成有符号类型, 否则转换成无符号类型, 如果无符号和有符号长度相等(如 int 和 unsigned int), 因为无符号数值域里有一半int表示不了, 所以是转换成无符号来运算的, 而不是有符号.
飞天御剑流 2014-07-20
  • 打赏
  • 举报
回复
引用 楼主 menzi11 的回复:
请问 size_t a=-1;或者 size_t b=1000; size_t a = -b; 是否符合标准? 咱先不管 溢出问题,我就是想让它溢出,只想知道这个是否符合标准? 谢谢!
这种行为符合C/C++标准,C/C++标准允许有符号和无符号整数之间的转换,只不过结果是实现相关的(不同的整数表示法会导致不同的结果),但没有溢出问题,因为无符号数是没有溢出概念的。
mrlgy 2014-07-20
  • 打赏
  • 举报
回复
我觉得你应该先搞明白计算机对数据是怎么处理的,你说的标准是指出不出错吗?这里明显不会出错,顶多编译器给个警告,也不会出现溢出
  • 打赏
  • 举报
回复
引用 楼主 menzi11 的回复:
请问 size_t a=-1;或者 size_t b=1000; size_t a = -b; 是否符合标准? 咱先不管 溢出问题,我就是想让它溢出,只想知道这个是否符合标准? 谢谢!
无符号和有符号的数运算的时候,统一转换成(强制转换)有符号的数。 所以-1就是最大值。这个不算是溢出。 b=1000;a=-b; 这个时候-b,比-1放到a里面小。 因为负数是以补码的形式存在的。
menzi11 2014-07-20
  • 打赏
  • 举报
回复
引用 1 楼 taodm 的回复:
难道我说符合或者不符合你就能信? C++标准在本论坛就有下载,你为啥不自己去翻呢?
你这人真奇怪,人类所有的知识你终其一生都能研究出来,你为什么要看书学? 而且有什么不能信的? 又不是国家机密. 这论坛上所有的问题,都能在其他地方找到答案,我为您设计好了回帖模板: C++标准在本论坛就有下载,你为啥不自己去翻呢? 你这个问题在google就能搜到,你为啥不自己去翻呢? 你这个问题在stack overflow就能搜到,你为啥不自己去翻呢? 你这个问题去问Bjarne Stroustrup就能知道,你为啥不自己去找他呢? 这些应该够了,凭借这几条模板相信您能很快成为论坛最能解决别人问题的人.
taodm 2014-07-20
  • 打赏
  • 举报
回复
难道我说符合或者不符合你就能信? C++标准在本论坛就有下载,你为啥不自己去翻呢?

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧