[英]Value of a+b and char type
我在C ++中工作,並且(作為練習)不得不在紙上寫下2個答案。 第一個問題:我們是否具有以下變量的聲明和初始化:
unsigned char x=250, z=x+7, a='8';
表達式的價值是什么?
z|(a-'0') // (here | is bitwise disjunction)
我們具有未簽名的char,因此將z=x+7
的數字減少為256,因此,在以二進制形式寫入數字之后,答案為9。
下一個問題:a和b是int變量, a=1
和b=32767
。
int的范圍是[-32768, 32767]
。 我們這里沒有未簽名的類型。 我的問題是: a+b
的值是多少? 如果某個變量的值大於該數據類型的范圍,則如何處理帶符號的數據類型?
下一個問題:a和b是int變量,
a=1
和b=32767
。[...]我的問題是:
a+b
的值是多少?
其不確定的行為 。 我們無法告訴您它將是什么。 我們可以做出合理的猜測,但是就C ++而言,有符號整數溢出是未定義的行為。
C ++中沒有operator+(unsigned char, unsigned char)
,它首先將這些unsigned char
參數提升為int
,然后再進行加法運算,因此表達式的類型為int
。
然后將該int
以適應其值太大, unsigned char
被轉換為unsigned char
。
該標准說:
整數類型的prvalue可以轉換為另一種整數類型的prvalue。 可以將無作用域枚舉類型的prvalue轉換為整數類型的prvalue。 如果目標類型是無符號的,則結果值是與源整數一致的最小無符號整數(取模2 ** n,其中n是用於表示無符號類型的位數)。 [注意:在二進制補碼表示中,此轉換是概念性的,並且位模式沒有任何變化(如果沒有截斷)。 —尾注]
對於第二個問題,答案是不確定的。
您可以這樣驗證自己:
#include <iostream>
using namespace std;
int main()
{
int a = 1;
int b = 32767;
int c = a+b;
cout << c << endl;
}
結果將取決於您的計算機。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.