相关疑难解决方法(0)

什么应该发生在size_t的否定(即`-sizeof(struct foo)`))?

我正在处理一些包含表单表达式的代码

-(sizeof(struct foo))
Run Code Online (Sandbox Code Playgroud)

即a的否定,size_t我不清楚编译器在看到这个时C和C++标准需要什么.具体来说,从此处和其他地方四处查看,sizeof返回类型的无符号整数值size_t.当否定无符号整数时,我找不到任何指定行为的明确引用.有没有,如果有的话,它是什么?

编辑:好的,所以关于无符号类型的算术有一些很好的答案,但事实并非如此.如果否定,它是在无符号整数上运行,还是转换为有符号类型并对其执行某些操作?从标准中预期的行为是"想象它是相似幅度的负数,然后对无符号值应用'溢出'规则"?

c c++ unsigned sizeof size-t

12
推荐指数
1
解决办法
2291
查看次数

为什么要担心签名类型的"未定义行为"?

我的问题与问题有关,并且几乎没有问题.

对我来说最明显的(意味着我会在我的代码中使用它)解决上述问题就是这样:

uint8_t x = some value;
x = (int8_t)x >> 7;
Run Code Online (Sandbox Code Playgroud)

是的,是的,我听到你们所有人......未定义的行为,这就是为什么我没有发布我的"解决方案".

我有一种感觉(也许只是我生病的头脑),术语"未定义的行为"在SO上被过度使用,只是为了证明如果问题被标记为c/c ++,那么就可以为某人辩护.

所以 - 让我们(暂时)抛开C/C++标准,思考日常生活/编程,真正的编译器实现以及它们为现代硬件生成的代码.

考虑到以下因素:

  • 据我所知,我遇到的所有硬件都有不同的算术和逻辑移位指令.
  • 我所知道的所有编译器都转换>>为有符号类型的算术移位和无符号类型的逻辑移位.
  • 我不记得任何编译器在c/c ++代码中使用div时发出类似于低级别的指令>>(我们在这里不讨论运算符重载).
  • 我所知道的所有硬件都使用U2.

所以...有什么(任何当代编译器,硬件)的行为与上面提到的不同?简单地说,我是否应该担心右移有符号值而不是转换为算术移位?

我的"解决方案"仅在许多平台上编译为一个低级指令,而其他平台则需要多个低级指令.你会在代码中使用什么?

请真相;-)

c c++ hardware bit-manipulation undefined-behavior

6
推荐指数
1
解决办法
285
查看次数