Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >未初始化变量的后果: int对无符号字符

未初始化变量的后果: int对无符号字符
EN

Stack Overflow用户
提问于 2017-08-04 04:04:45
回答 4查看 2K关注 0票数 26

我在cppreference.com上看到了下面的示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int x;     // OK: the value of x is indeterminate
int y = x; // undefined behavior

在这里,int y = x;未定义的行为,因为x未初始化。

但,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
unsigned char c;     // OK: the value of c is indeterminate
unsigned char d = c; // OK: the value of d is indeterminate

这里,unsigned char d = c;不确定行为,但unsigned char c;也是一个未初始化的变量。

那么,为什么unsigned char d indeterminate?的值是?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-08-04 04:44:02

cppreference.com这样的在线参考资料在某种程度上是很好的。但众所周知,有时错误或错误解释有时会溜走。因此,在处理这些奇怪的问题时,使用正式的C++标准总是一件好事。

N3936 §8.5初始化器dcl.init 12 ..。当获得具有自动或动态存储持续时间的对象的存储时,该对象具有一个不定值,如果不对该对象执行初始化,则该对象保留一个不确定值,直到该值被替换(5.17)。..。如果由求值产生不确定值,则行为是未定义的,除非在下列情况下:

  • 如果无符号窄字符类型(3.9.1)的不确定值是由
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- [...]
- the operand of a cast or conversion to an unsigned narrow character type (4.7, 5.2.3, 5.2.9, 5.4)
- [...]

然后操作的结果是一个不确定的值。

  • 如果由简单赋值运算符(5.17)的右操作数(5.17)的求值产生无符号窄字符类型的不定值,其第一个操作数是无符号窄字符类型的值,则不确定值将替换左操作数所引用的对象的值。
  • 如果初始化未符号窄字符类型的对象时,初始化表达式的计算会产生无符号窄字符类型的不确定值,则该对象被初始化为不确定值。

示例:

int f(bool b) {无符号字符c;无符号char d= c;// OK,d具有不确定值int e= d;//未定义行为返回b?如果b为true,则D: 0;//未定义的行为

所以(让我吃惊的是)标准支持了这一点。

至于为什么,最可能的原因也可以在标准中找到:

§3.9.1基本类型basic.fundamental 1 ..。对于无符号窄字符类型,值表示的所有可能的位模式都表示数字。这些要求不适用于其他类型的

顺便提一句,我刚刚意识到这可以被一个邪恶的面试官所利用:

在定义良好的行为中,可以将对象的有效值更改为未定值吗?如果是,怎么做?

一个。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
unsigned char ind;
unsigned char x = 24;
x = ind; // x had a valid value, now x has an indetermined value
票数 26
EN

Stack Overflow用户

发布于 2017-08-04 04:23:17

从您引用的页面中:从不确定值分配是未定义的行为,

如果无符号窄字符类型或std::字节的不确定值分配给另一个具有无符号窄字符类型或std::字节的变量(变量的值变为不确定的,但行为不是未定义的)

我认为这是因为默认初始化可能会将任何比特组合放入变量中,虽然标准保证一个无符号的窄字符类型可以接受由每个可能的位模式表示的值,但是对于其他类型却没有这样的保证。

票数 18
EN

Stack Overflow用户

发布于 2017-08-04 04:20:13

来自链接页面

默认情况下使用不确定值初始化任何类型的非类变量都是未定义的行为.但下列情况除外: ..。 如果使用无符号窄字符类型或std::字节的不确定值来初始化具有无符号窄字符类型或std::字节的另一个变量;

unsigned char是一个无符号的窄字符,因此这是不发生UB的例外情况之一。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45506400

复制
相关文章
【今日问题】变量未初始化引起的崩溃
昨天写的今日问题,有小伙伴给我反馈,觉得挺有用,小编今天继续给小伙伴们总结遇到的常见问题 一、初学者经常由于没有养成良好的编程习惯,未初始化变量会引起那些问题 使用未初始化的变量是常见的程序错误,通常也是难以发现的错误。虽然许多编译器都至少会提醒不要使用未初始化变量,但是编译器并未被要求去检测未初始化变量的使用。而且,没有一个编译器能检测出所有未初始化变量的使用。 现象列举: 1、引起程序运行时突然崩溃   这种结果已近是相当好了,至少你可以发现程序崩溃的位置,及时的修正问题 2、程序运行成功但是结果错
程序员互动联盟
2018/03/13
2.2K0
无符号整型和有符号整型的区别,以及无符号整型的使用
size_t 等价于unsigned int 接收sizeof的返回值要用%u
大忽悠爱学习
2021/03/04
4.4K0
无符号数和有符号数
人有十个手指头,习惯了逢十进一,于是十进制成了生活中的标准。程序的世界只有高低电平两种状态,更适合用二进制来表示,于是二进制成了程序世界的标准。 对与无符号数来说,我们更喜欢谈他们之间的转化,十进制是我们最习惯的进制,于是十进制转为R进制,R进制转为十进制变尤为重要。
naget
2019/07/03
3.1K0
无符号数和有符号数
PWN 无符号和有符号整型的绕过漏洞
C语言中,无符号整型数是不带正负表示符号的整型数。C语言在计算机里编译时数都是用二进制表示的,如果最左边这一位不用来表示正负,而是和后面的连在一起表示整数,那么就不能区分这个数是正还是负,就只能是正数,这就是无符号整型数。
yulate
2023/05/02
9660
PWN 无符号和有符号整型的绕过漏洞
对未初始化的的chan进行读写,会怎么样?为什么?
关于 chan 的面试题非常多,这个是比较常见的其中一个。但多问一句:为什么对未初始化的 chan 就会阻塞呢?
9号同学
2021/03/03
6430
对未初始化的的chan进行读写,会怎么样?为什么?
C++ 中有符号类型到无符号类型的转换
为了更好地解释下面的代码,先来介绍一些背景知识,在我的计算机中, char 类型占 8 个比特位,那么, unsigned char 类型能表示的数的范围为 0 ~ 2的8次方 - 1,即 0 ~ 255,共 256 个数;int 类型占 32 个比特位,那么 unsigned 类型所能表示的数的范围为 0 ~ 2的32次方 - 1,即 0 ~ 4294967295,共 4294967296 个数,接下来看下面的代码:
用户7886150
2021/02/15
1.4K0
mold源码阅读九 未解析符号的处理
本期内容主要是claim_unresolved_symbols的部分,其次是其他一些简单的处理
AkemiHomura
2023/10/22
2080
FPGA设计中 有符号数、无符号数
大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。
FPGA技术江湖
2020/12/29
1.7K0
FPGA设计中 有符号数、无符号数
mysql无符号整型溢出
下午用sql的时候突然想到这个问题,徒手测试了一下,结果还真令人意外: 首先创建一张测试用表 mysql> CREATE TABLE `t1` ( -> `id` int UNSIGNED NOT NULL AUTO_INCREMENT , -> `val` int UNSIGNED NOT NULL DEFAULT 0 , -> PRIMARY KEY (`id`) -> ); Query OK, 0 rows affected (0.04 sec) 初始化一条数据: mysql> insert in
码农二狗
2018/06/29
2K0
loadrunner 脚本开发-int型变量和字符串的相互转换
Action2.c(5): Notify: Saving Parameter "param = 12345".
授客
2019/09/10
6650
移位运算(无符号移位运算,有符号移位运算)
可以移位运算的类型有:iuint,int,lang等类型.我们本次使用int类型 一个int类型占4个字节,共32位,带符号位,所以最高位位符号位(使用0,1表示符号位)
全栈程序员站长
2022/09/14
1.4K0
数制转换itoa atoi int转字符串 字符串转int string转int int转string
C语言提供了几个标准库函数,可以将任意类型(整型、长整型、浮点型等)的数字转换为字符串,下面列举了各函数的方法及其说明。 1.itoa():将整型值转换为字符串。 用法itoa(int,char*,int) 即(要转化的整形数,目标字符数组,进制) 2. ltoa():将长整型值转换为字符串。 用法ltoa(long,char*,int) 即(要转化的长整形数,目标字符数组,进制) ● gcvt():将浮点型数转换为字符串,取四舍五入。 用法gcvt(double,int,char*) 即(要转化的双精度浮点数,保留位数,目标字符串) ● ecvt():将双精度浮点型值转换为字符串,转换结果中不包含十进制小数点。 用法charecvt(double,int,int,int*) charecvt(双精度浮点数,保留位数,小数点位置,转换浮点数的符号) 这个函数存储最多ndigit个数字值作为一个字符串,并添加一个空数字符(’\0’),如果双精度浮点数中的数字个数超过保留位数,低位数字被舍入。如果少于保留位数个数字,该字符串用0填充浮点数符号0为正其余为负数。 ● fcvt():指定位数为转换精度,其余同ecvt()。 用法charfcvt(double,int,int*,int*) charfcvt(双精度浮点数,保留小数点后位数,小数点位置,转换浮点数的符号) 2. C/C++语言提供了几个标准库函数,可以将字符串转换为任意类型(整型、长整型、浮点型等)。 ● atof():将字符串转换为双精度浮点型值。 double atof=char(const char) ● atoi():将字符串转换为整型值。用法同上。 ● atol():将字符串转换为长整型值。用法同上。 ● strtod():将字符串转换为双精度浮点型值,并报告不能被转换的所有剩余数字。double strtod(char * str,char * str) double strtod(转换的来源字符串首地址,不能转换数字的首地址) ● strtol():将字符串转换为长整值,并报告不能被转换的所有剩余数字。 strtol(char * str,char * str,int) double strtol(转换的来源字符串首地址,不能转换数字的首地址,基于进制) ● strtoul():将字符串转换为无符号长整型值,并报告不能被转换的所有剩余数字。用法同上。
风骨散人Chiam
2020/10/28
4K0
C/C++ int数组初始化
即后面4个元素调用了string的默认构造函数进行的初始化,而第一个则调用的string::string(const char*)进行的初始化。
全栈程序员站长
2022/09/09
1K0
对反事实后果有信念的理论AI模型
主动推理提供了感知行为的第一原理描述,从中可以导出特殊和重要的案例,例如强化学习、主动学习、贝叶斯最优推理、贝叶斯最优设计等。主动推理通过将信息获得置于与奖励或价值相同的基础上,解决了与先前偏好相关的开发-探索困境。简而言之,主动推理以预期(变分)自由能的形式,用(贝叶斯)信念的泛函代替了价值函数。在本文中,我们考虑一种复杂的主动推理,使用预期自由能的递归形式。复杂性描述了一个代理对信念的信任程度。我们考虑对事态的行动的反事实后果有信念的代理人和对那些潜在状态有信念的代理人。换句话说,我们从简单地考虑“如果我做了那件事会发生什么”转变为“如果我做了那件事,我会相信发生什么”。自由能泛函的递归形式有效地实现了对未来行动和结果的深树搜索。至关重要的是,这种搜索是基于信念状态的序列,而不是状态本身。我们用深层决策问题的数值模拟来说明这种方案的能力。
CreateAMind
2023/09/01
2690
对反事实后果有信念的理论AI模型
基础野:细说无符号整数
Brief                                 本来只打算理解JS中0.1 + 0.2 == 0.30000000000000004的原因,但发现自己对计算机的数字表示和运算十分陌生,于是只好恶补一下。   本篇我们一起来探讨一下基础的基础——无符号整数的表示方式和加减乘除运算。 Encode                                 无符号整数只能表示大于或等于零的整数值。其二进制编码方式十分直观,仅包含真值域。   我们以8bit的存储空间为例,真值域则
^_^肥仔John
2018/01/18
1.3K0
整数的存储:无符号表示法
整数在计算机里是以什么样的形式存储的呢?我们已经知道,计算机的数据是以位模式的形式存储的。也就是说,计算机存储的是二进制的内容。整数在计算机中有很多种存储方法,主要有下面三种:无符号表示法、符号加绝对值表示法和二进制补码表示法。这篇文章主要讨论无符号表示法。 无符号表示法仅仅是整数存储方法中的一种,接下来还会介绍符号加绝对值表示法和二进制补码表示法,敬请期待。
mwangblog
2018/07/04
1.1K0
基础野:细说无符号整数[通俗易懂]
本来只打算理解JS中0.1 + 0.2 == 0.30000000000000004的原因,但发现自己对计算机的数字表示和运算十分陌生,于是只好恶补一下。
全栈程序员站长
2022/09/20
1.4K0
C语言中,全局变量滥用的后果竟如此严重?
说起全局变量,就不得不提到“全局变量,局部变量,静态全局变量,静态局部变量”,这些都是编程语言中的基本概念。变量分为局部与全局,局部变量又可称之为内部变量。由某对象或某个函数所创建的变量通常都是局部变量,只能被内部引用,而无法被其它对象或函数引用。
C语言与CPP编程
2020/12/02
1.4K0
C语言中,全局变量滥用的后果竟如此严重?
3,变量与标点符号
与C等许多编程语言相比,作为动态语言的Python,其变量是一个标签,而不是一个容器。
lyhue1991
2020/07/20
9170
3,变量与标点符号
如何检测无符号整数乘法溢出
我在写一个程序计算 a ^ b = c 其中 a、b、c 都是无符号整数。为了检测乘法溢出,我写了下面的检测程序,
ClearSeve
2022/02/10
1.3K0

相似问题

int对无符号int对size_t

21

签名int未转换为无符号int

11

memcpy无符号int到无符号字符分割故障

212

将无符号int初始化为0?

21

符号int模无符号int生成无符号的结果。

312
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文